QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1092|回复: 2

求如何编写强制umount磁盘挂载的程序?

[复制链接]
发表于 2004-7-3 11:45:36 | 显示全部楼层 |阅读模式
求如何编写强制umount磁盘挂载的程序?
我这里有个soleris下的程序,参考,能把它在linux下编译执行就可以了
[code:1]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>//for sleep
#include <signal.h>
int VolumeUMount (const char *szDev, const char *szPoint);
int KillMount(const char *szPoint);
main(int argc,char *argv[])
{
        if(argc!=3)
        {
                printf("Usage:UMOUNT devicename mountpoint\n");
                exit(1);
        }
        if(access(argv[1],F_OK)!=0)
        {
                printf("%s does not exist!\n",argv[1]);
                return 0;
        }
        if(access(argv[2],F_OK)!=0)
        {
                printf("%s does not exist!\n",argv[2]);
                return 0;
        }
        printf("return:%d\n",VolumeUMount(argv[1],argv[2]));
}

int VolumeUMount (const char *szDev, const char *szPoint)
{
        char buf[256];
        sprintf (buf, "mount | grep %s >/dev/null 2>&1",szDev);
        if(system(buf)!=0)
        {
                printf("%s is not mounted!\n",szDev);
                return 0;
        }
        else
                KillMount(szPoint);
        sprintf (buf,"fuser -ck %s >/dev/null 2>&1",szPoint);
        system(buf);
        sleep(2);
        sprintf(buf,"umount %s >/dev/null 2>&1",szDev);
        if(system(buf)==0)
                return 0;
        return 1;
}

int KillMount(const char *szPoint)
{
        char buf[256];
        char szFile[64],*cp;
       
        strcpy(szFile,"KillMount.tmp");
        sprintf(buf, "ps -ef | /usr/bin/grep %s > %s 2>/dev/null",szPoint,szFile);
        if(system(buf)!=0)
        {
                printf("ps -ef ERROR\n");
                return -1;
        }
        FILE *fp=fopen(szFile,"r");
        if(fp==NULL)
                return -1;
        int nPid=0;
        int fKilled=0;
        while(fgets(buf,sizeof(buf),fp)!=NULL)
        {
                if(strstr(buf,"grep")!=NULL)
                        continue;
                strtok(buf," ");
                cp=strtok(NULL," ");
                nPid=atoi(cp);
                if(nPid==getpid())
                        continue;
                if(nPid>0)
                {
                        kill(nPid,SIGKILL);
                        sleep(2);
                        fKilled=1;
                }
            }
        fclose(fp);
        unlink(szFile);
        return fKilled;
}
[/code:1]
发表于 2004-7-3 18:39:02 | 显示全部楼层
利用ps -ef找出正在访问磁盘设备的进程,将得到的进程ID列表保存到KillMount.tmp文件里,然后打开KillMount.tmp,逐个读出里面的pid向进程发送SIGKILL信号来强行杀死??
回复

使用道具 举报

 楼主| 发表于 2004-7-3 22:02:47 | 显示全部楼层
这是原理,感谢,已经解决了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 23:54 , Processed in 0.039680 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表