Linux c 获取U盘挂载路径

思路:

  1、执行df -h 找到 带mnt的行。将结果存入一个文件中。

  system("df -h |grep mnt >./extendevinfo.txt");  也可以直接popen用管道打开,感觉
效率可能会更高一些。

        2、解析文件中最后/mnt/XXX部分即为挂载路径。(具体看自己内核挂载路径,可能会有差异)

例如本人系统挂载U盘后的df -h |grep mnt,结果如下:

eg:/dev/sda                 14.6G      9.6G      5.0G  66% /mnt/exUDISK

  3、解析到空格最后的内容就是U盘的挂载路径了:/mnt/exUDISK。

/*
*@brief  获取U盘挂载路径
*@param  获取的挂载路径
*@return 成功返回0.失败返回-1
*/
static int GetUDiskMountPath(char * mnt_path)
{
    int fd = 0, ret = 0, rdsize = 0;
    char buf[1024] = {0};
    fd = open("./extendevinfo.txt", O_CREAT | O_RDWR | O_NONBLOCK | O_TRUNC, 0777);
    if(fd < 0)
    {
        printf("open error\n");
        return - 1;
    }    
    ret = system("df -h |grep mnt >./extendevinfo.txt");
    if(ret)
    {
    //    printf("system error\n");
        return - 1;
    }
    
    rdsize = read(fd, buf, sizeof(buf));
//    printf("buf = %s\n", buf);
    if(rdsize < 2)
    {
        printf("read error\n");
        return - 1;
    }

    ret = analysis_monut_info(buf, mnt_path);

    close(fd);
    return ret;
}

/*
*@brief  从buf中返回最后一组为/mnt/exUDISK为挂载路径
eg:/dev/sda                 14.6G      9.6G      5.0G  66% /mnt/exUDISK
*@param  获取的挂载路径
*@return 成功返回0.失败返回-1
*/
static int analysis_monut_info(char *buf, char *path)
{
    char *info = buf;
    char value[128] = {0};
    int ret = 1; 
//    printf("@buf %s", buf);
    while(0 != ret)
    {
        sprintf(path, "%s", value);
        memset(value, 0, sizeof(value));
        ret = get_info_value(&info, value);
    }
    return ret;
}

/*
*@brief  从buf中返回用空格和换行为分隔符的部分。并向前移动地址位置。
*@param  info 查找的源,value 返回的字符串
*@return 成功返回0.失败返回-1
*/
static int get_info_value(char **info, char *value)
{
    char *vernier = 0;
    int i = 0;
    vernier = *info;
    while((*vernier == ' ') || (*vernier == '\n'))
    {
        vernier++;
    }
    for(i = 0; *vernier != 32 && *vernier != '\n' && *vernier != '\0' && i < 64;i++)
    {
        value[i] = *vernier;
        vernier++;
    }
    if(*vernier == '\0')
    {
        return 0;
    }
    *info = vernier;
    return - 1;
}

 

posted @ 2022-05-25 13:42  大龄小凡  阅读(2044)  评论(0编辑  收藏  举报