对于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");
}
}