linux下轮询方式U盘的自动挂载与卸载

对于linux下自动挂载U盘有存在更好的方便,我这自己记录下一种比较简单粗暴的方式

1.查找是否有U盘设备

1.1查找/proc/diskstats文件中是否有"sd"字符串,存在的话执行下一步

1.2 通过命令fdisk -l |grep "/dev/sd"获取磁盘分区

如下图获取到的是“/dev/sda”

获取的分区有可能是a、b等,如下图插了两个U盘就有b,或挂载完没卸载,拔掉U盘再插上,查询也会变成b

2.查看U盘是否已经挂载

2.1查找/proc/mounts文件中是否有”/media/usb”(要挂载的目录)字符串

3.挂载U盘

3.1当U盘设备存在且未挂载时执行

通过命令mkdir -p /media/usb先创建要挂载的文件夹,这里我挂载在/media/usb下

通过命令mount -t auto -o iocharset=utf8,umask=0 /dev/sda1 /media/usb进行挂载

注意:获取磁盘分区后一般都在1上所以是对“/dev/sda1”进行挂载

4.卸载U盘

4.1当U盘设备不存在且已挂载时执行

通过命令umount /media/usb进行卸载(对于上面的挂载也可以用umount /dev/sda1进行卸载)

5.具体代码实现

/**************************************************************************************************
**  函数名称:pub_tool_excute_shell_cmd_popen
**  功能描述:使用popen执行shell命令
**  输入参数:*cmd:脚本命令
**            buff_len:缓冲区长度
**  输出参数:*buff:执行命令返回的信息
**  返回参数:返回0表示脚本命令执行成功,返回-1表示执行失败
**************************************************************************************************/
INT32S pub_tool_excute_shell_cmd_popen(INT8S *cmd, INT8S *buff, INT32S buff_len)
{
    FILE * fp;
    INT32S len;
    
    if (NULL == (fp = popen((INT8T *)cmd,"r"))) {
        return -1;
    }

    fseek(fp, 0, SEEK_SET);

    if (NULL != buff && 0 < buff_len) {
        memset(buff,0,buff_len);
        len = fread(buff, buff_len - 1, 1, fp);
    }

    len = len;
    pclose(fp);

    return 0;
}

/**************************************************************************************************
**  函数名称:check_diskstats
**  功能描述:查找diskstats文件中是否有指定的字符串
**  输入参数:devPoint - 需要查找的字符串
**  输出参数:无
**  返回参数:-1 - 失败;0 - 找到
**************************************************************************************************/
static INT32S check_diskstats(char *devPoint)
{
    char line[1024];
    FILE *fp;
    int ret = -1;
    
    fp = fopen("/proc/diskstats", "r");
    if(fp == NULL)
        return -1;
    
    while(!feof(fp)){
        memset(line, 0, sizeof(line));
        fgets(line, 1023, fp);
        if (strlen(line) > 0){
            if (strstr(line, devPoint) != NULL){
                ret =0;
                break;
            }
        }
    }
    
    fclose(fp);
    
    return ret;
}

/**************************************************************************************************
**  函数名称:check_fdisk
**  功能描述:查找磁盘分区表中是否有指定的设备
**  输入参数:devPoint - 需要查找的字符串
**  输出参数:devName - 设备的名称
**  返回参数:-1 - 失败;0 - 找到
**************************************************************************************************/
static INT32S check_fdisk(char *devPoint, char *devName)
{
    INT8T cmd[64];
    INT8T buffer[1024];
    INT8T *p_start;
    INT8T *p_end;
    INT8T *p;
    INT8U offset;

    if(!devPoint){
        return -1;
    }

    memset(cmd,0,sizeof(cmd));
    sprintf((char*)cmd,"fdisk -l |grep \"%s\"",devPoint);
    memset(buffer, 0, sizeof(buffer));
    if( pub_tool_excute_shell_cmd_popen((INT8S*)cmd, (INT8S*)buffer, sizeof(buffer)) != 0 ){
        return -1;
    }
    offset = 0;
    p_start = buffer;
    while(1){
        if(strlen(p_start)>0){
            p = strstr(p_start+offset, "Disk");
            if (p != NULL){
                p_start = p;
                offset = 1;
                continue;
            }
            p = p_start;
            p_start = strstr(p, " ");
            p_start++;
            p_end = strstr(p_start, ":");
            if ((p_end != NULL)&&(p_start != NULL)){
                memcpy(devName, p_start, p_end - p_start);
                devName[p_end - p_start] = 0;
            }
            
            if (access(devName, F_OK) == 0){
                return 0;
            }
            break;
        }else{
            break;
        }
    }
	return -1;
}


/**************************************************************************************************
**  函数名称:check_mount
**  功能描述:查找设备是否已经挂载
**  输入参数:devPoint - 设备名称
**  输出参数:无
**  返回参数:-1 - 未挂载;0 - 已挂载;
**************************************************************************************************/
static INT32S check_mount(char *devPoint)
{
    char line[1024];
    FILE *fp;
    int ret =-1;
    
    fp = fopen("/proc/mounts", "r");
    if(fp == NULL)
        return -1;
    
    while(!feof(fp)){
        memset(line, 0, sizeof(line));
        fgets(line, 1023, fp);
        if (strlen(line) > 0){
            if (strstr(line, devPoint) != NULL){
                ret =0;
                break;
            }
        }
    }
    fclose(fp);
    
    return ret;
}

/**************************************************************************************************
**  函数名称:usb_flash_disk_check
**  功能描述:U盘检测
**  输入参数:无
**  输出参数:无
**  返回参数:
**************************************************************************************************/
static void usb_flash_disk_check(void)
{
    char devName[100];
    INT8T cmd[100];
    int checkDev = -1;      /*是否有设备*/
    int checkDevMount = -1; /*设备是否挂载*/

    memset(devName, 0, sizeof(devName));
    if (check_diskstats("sd") == 0){
        checkDev = check_fdisk("/dev/sd", devName);
    }
    checkDevMount = check_mount("/media/usb");
    if ((checkDev == 0)&&(checkDevMount == -1)){
        /*挂载U盘*/
        memset(cmd, 0, sizeof(cmd));
        sprintf(cmd, "umount %s1", devName);
        pub_tool_excute_shell_cmd((INT8S*)cmd);
        
        memset(cmd, 0, sizeof(cmd));
        pub_tool_excute_shell_cmd((INT8S*)"mkdir -p /media/usb");
        sprintf(cmd, "mount -t auto -o iocharset=utf8,umask=0 %s1 /media/usb", devName);
        pub_tool_excute_shell_cmd((INT8S*)cmd);
        
    }else if ((checkDev == -1)&&(checkDevMount == 0)){
        /*卸载U盘*/
        pub_tool_excute_shell_cmd((INT8S*)"umount /media/usb");
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值