挂载路径自己修改即可:

U盘挂载部分:

#include "checkudisk.h"checkUdisk::checkUdisk(QObject *parent): QObject(parent)
{check = new usbCheck();thread = new QThread();connect(thread, SIGNAL(started()),check,SLOT(checking()));connect(thread, SIGNAL(finished()),check, SLOT(deleteLater()));connect(check,SIGNAL(usbName(QStringList,int)),this,SLOT(getName(QStringList,int)));check->moveToThread(thread);}void checkUdisk::started()
{int pos=0;bool fdiskU,dfU;QString cmd,path;QDir dir;QString checkResult;//fdisk -l 检查/dev下是否识别U盘/sd[a-z][0-9]{1,2}runCmd checkU;QString fidsk = "fdisk";QStringList fdisk_list;fdisk_list<<"-l";checkU.setCmd(fidsk,fdisk_list);checkResult = checkU.getString();fdisk_list.clear();QRegExp rx("sd[a-z][0-9]{1,2}");while( (pos = rx.indexIn(checkResult,pos)) != -1 ){fdisk_list<<rx.cap(0);pos += rx.matchedLength();}//检测到的 sd* 存于fdisk_list列表if(fdisk_list.length() == 0)fdiskU = false;elsefdiskU = true;//df -h 检查对应的U盘是否挂载;checkResult.clear();runCmd chechDf;QString df = "df";QStringList df_list;df_list<<"-h";chechDf.setCmd(df,df_list);checkResult = chechDf.getString();df_list.clear();QRegExp rz("/dev/sd[a-z][0-9]{1,2}");pos = 0;while( (pos = rz.indexIn(checkResult,pos)) != -1 ){df_list<<rz.cap(0);pos += rz.matchedLength();}if(df_list.length() == 0)dfU = false;elsedfU = true;if(fdiskU == true){if(dfU == false){for(int i=0; i<fdisk_list.length();i++){path = QString("/mnt/%1").arg(fdisk_list.at(i));dir.mkdir(path);cmd = QString("mount /dev/%1 /mnt/%1").arg(fdisk_list.at(i));system(cmd.toStdString().c_str());}}}thread->start();
}checkUdisk::~checkUdisk()
{disconnect(thread, SIGNAL(started()),check,SLOT(checking()));disconnect(thread, SIGNAL(finished()),check, SLOT(deleteLater()));if(thread){if(thread->isRunning()){thread->quit();thread->wait();}delete thread;thread = NULL;}if(check){delete check;check = NULL;}
}void checkUdisk::getName(QStringList strList,int statue)
{QString cmd,path;QDir dir;if(strList.length() == 0)return;if(statue == 0){for(int i=0; i<strList.length();i++){path = QString("/mnt/%1").arg(strList.at(i));cmd = QString("umount /mnt/%1").arg(strList.at(i));system(cmd.toStdString().c_str());dir.rmdir(path);}}else if(statue == 1){for(int i=0; i<strList.length();i++){path = QString("/mnt/%1").arg(strList.at(i));dir.mkdir(path);usbPathList<<path;cmd = QString("mount /dev/%1 /mnt/%1").arg(strList.at(i));system(cmd.toStdString().c_str());}}else{for(int i=0; i<usbPathList.length();i++){dir.rmdir(usbPathList.at(i));}}//qDebug()<<cmd;
}
#ifndef CHECKUDISK_H
#define CHECKUDISK_H#include <QThread>
#include <QStringList>
#include <QString>
#include <QFile>
#include <QFileInfo>
#include <QDir>
#include "usbcheck.h"
#include "runCmd.h"class usbCheck;
class runCmd;
class checkUdisk : public QObject
{Q_OBJECT
public:explicit checkUdisk(QObject *parent = 0);bool checking();void started();~checkUdisk();public slots:void getName(QStringList,int statue);
private:QThread *thread;usbCheck *check;QStringList usbPathList;
};#endif // CHECKUDISK_H

运行部分:

#include "runCmd.h"runCmd::runCmd(QObject *parent) : QObject(parent)
{process = new QProcess(this);connect(process, SIGNAL(readyRead()),this,SLOT(readyRead()));
}runCmd::~runCmd()
{delete process;
}QString runCmd::getString()
{while(false == process->waitForFinished());return putout;
}void runCmd::setCmd(QString str,QStringList strList)
{if(strList.length()==0){process->start(str);}else{process->start(str,strList);}
}void runCmd::readyRead()
{putout = process->readAll();
}

.h

#ifndef RUNCMD_H
#define RUNCMD_H#include <QProcess>
#include <QDebug>#include <QObject>class runCmd : public QObject
{Q_OBJECT
public:explicit runCmd(QObject *parent = 0);~runCmd();void setCmd(QString,QStringList);QString getString();
signals:public slots:void readyRead();private:QProcess *process;QString putout;
};#endif // RUNCMD_H

检测usb代码:

#include "usbcheck.h"usbCheck::usbCheck(QObject *parent) : QObject(parent)
{sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT);memset(&client,0,sizeof(client));client.nl_family = AF_NETLINK;client.nl_pid = getpid();client.nl_groups = 1;buffersize = 1024;setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF,&buffersize, sizeof(buffersize));//    if(bind(sockfd, (struct sockaddr *)&client,sizeof(client)))
//        qDebug()<<"bind error:"<<strerror(errno);bind(sockfd, (struct sockaddr *)&client,sizeof(client));}void usbCheck::checking()
{for(;;){char buf[UEVENT_BUFFER_SIZE] = {0};FD_ZERO(&fds);FD_SET(sockfd,&fds);tv.tv_sec = 0;tv.tv_usec = 100*1000;result = select(sockfd+1,&fds, NULL,NULL, &tv);if(result <0)continue;if(!(result>0 && FD_ISSET(sockfd,&fds)))continue;receiveLenth = recv(sockfd,&buf,sizeof(buf),0);if(receiveLenth >0){getName(buf);}}
}//            emit usbName(QString("sdb1"),1);//0 remove
//            emit usbName(str,1);//1 add
//ID = str.mid(str.indexOf(new QRegExp("[0-9]{1,2}")));
void usbCheck::getName(QString buf)
{QString statue = buf.split("@").at(0);QStringList resultList;
//    QRegExp rx("\/sd[a-z]{1}[0-9]{1,2}");QRegExp rx("sd[a-z]{1}[0-9]{1,2}");int pos = 0;while( (pos = rx.indexIn(QString(buf),pos)) != -1){resultList<<rx.cap(0);pos += rx.matchedLength();}if(statue == "remove"){emit usbName(resultList,0);}else if(statue == "add"){emit usbName(resultList,1);}
}
#ifndef USBCHECK_H
#define USBCHECK_H#include <QObject>#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>//#include <QDebug>
#include <QString>
#include <QStringList>
#include <asm/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>#include "head.h"#define UEVENT_BUFFER_SIZE 4096class usbCheck : public QObject
{Q_OBJECT
public:explicit usbCheck(QObject *parent = 0);signals:void usbName(QStringList ,int statue);
public slots:void checking();
private:void getName(QString);
private:int sockfd;struct sockaddr_nl client;struct timeval tv;struct msghdr msg;struct iovec iov;fd_set fds;int receiveLenth,i,result;int buffersize;};#endif // USBCHECK_H

公用头:

#ifndef HEAD_H
#define HEAD_H#include <QObject>
#include <QString>
//#include <QDebug>
#include <QThread>
#include "usbcheck.h"
#include "checkudisk.h"
#include "runCmd.h"#endif // HEAD_H

main:

#include <QCoreApplication>
#include "head.h"
#include "checkudisk.h"class checkUdisk;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);checkUdisk check;check.started();return a.exec();
}

代码简单久不解释了,原理用的是socket检测内核usb事件,匹配出来以后 手动挂载.

完整工程代码:umount.zip

linux下监控usb自动挂载相关推荐

  1. linux u盘插入事件,Linux 下监控USB设备拔插事件

    Linux 下监控USB设备拔插事件 发布时间:2018-01-29 00:00, 浏览次数:1111 , 标签: Linux USB * 使用Netlink来实现 这是一个特殊的socket,可以接 ...

  2. Linux 下监控USB设备拔插事件

    使用Netlink来实现 这是一个特殊的socket,可以接受来自内核的消息 代码如下: 运行结果如下: 当有USB设备插入时: 当有USB设备拔出时: 2.使用udev的规则来实现 自2.6 核心开 ...

  3. linux 磁盘挂载 uuid,Linux如何根据UUID自动挂载磁盘分区

    一般服务器都有多个硬盘分区,在重启后,这些分区的逻辑位置加载时可能会发生变动,如果使用传统的设备名称(例如:/dev/sda)方式挂载磁盘,就可能因为磁盘顺序变化而造成混乱. Linux环境中每个Bl ...

  4. 嵌入式Linux操作系统移植IMX6开发板之实现USB 自动挂载

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 本篇文章讲述如何实现USB自动挂载,U盘即插即用,不用手动挂载的方法 ...

  5. linux格式化大于2t硬盘分区,linux下大于2tb硬盘格式化及挂载,linux下大于2t的分区方法,linux gpt分区表 管理 自动挂载分区...

    linux下大于2tb硬盘格式化及挂载,linux下大于2t的分区方法,linux gpt分区表 管理 自动挂载分区 (7页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找 ...

  6. linux里进程监控和自动重启,Linux - linux进程监控和自动重启的简单实现

    linux进程监控和自动重启的简单实现 目的:linux 下服务器程序会由于各类缘由dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能.linux 实现原理:由定时任务crontab调 ...

  7. Linux 下的U盘挂载

    Linux 下的U盘挂载 在做仿真的过程中,因为是通过wifi 连接的服务器,所以从服务器下载跑出来的图片还好,txt文件就会丢包.这时就需要从服务器把跑出来的txt文本文件下载下来,用以进行分析或者 ...

  8. linux 进程自重启,linux 进程监控和自动重启的简单实现

    目的:linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能. 实现原理:由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重 ...

  9. 在Fedora 16 linux下安装USB无线网卡驱动88x2bu

    在Fedora 16 linux下安装USB无线网卡驱动88x2bu USB无线网卡翼联EP-AC1610兼容linux系统 我之前已经买了一个USB无线网卡是水星mw150us,但是没有linux驱 ...

最新文章

  1. 1048 Find Coins(散列解法)
  2. 勤于思考:从客户端中检测到有潜在危险的 Request.Form 值
  3. Matlab | 数字信号处理:Matlab语言的基本使用方法(matlab代码版)
  4. 关于.NET编译的目标平台(AnyCPU,x86,x64)
  5. Java SecurityManager checkDelete()方法与示例
  6. Python3.1-标准库之Numpy
  7. 华为全面启航计算战略:“鲲鹏+昇腾”双引擎
  8. hbase 使用lzo_带你快速上手HBase | HBase列族优化
  9. django 定制管理页面外观 模板文件不生效的解决方法
  10. Richard S. Sutton个人主页翻译
  11. Android Multimedia框架总结(二十五)MediaProjection实现手机截屏(无须root)
  12. 序列的傅里叶变换MATLAB实现
  13. RGB 颜色格式转换
  14. jupyter notebook 302 get打不开
  15. 利用树制作的简易家谱
  16. 苏宁易购正在“酝酿”下一场蝶变?
  17. 李忠汇编语言-初学-第九章详解
  18. 怎样才能成为一名优秀的高薪程序员?
  19. 移动互联网的未来在非洲
  20. 新年集五福将,免费合成烤仔 “守护神兔” 典藏版 POAP 藏品!快来快来!

热门文章

  1. axios 拦截器不生效填坑
  2. canvas绘制可缩放的室内地图和路径
  3. Java蓝桥杯14年第一题
  4. opencv--读取摄像头识别人脸并跟踪
  5. Excel快速下拉多行函数式、快速选中多行数据
  6. 旋转变换的一些个人理解
  7. 水文水动力模型在城市内涝、城市排水、海绵城市规划设计中教程
  8. 群晖服务器共享文件忘记密码,群晖Synology忘记管理员密码的重置办法
  9. 学习C语言,因为前段时间一直在忙学业和实验室的事情,在学计算机网络,所以没怎么学C语言
  10. 系统分析与设计学习笔记(六)包图