本文实例讲述了C++实现Linux下弹出U盘的方法。分享给大家供大家参考。具体如下:
在linux下,对于usb设备,我们一般都是mount上使用,不使用时umount掉就可以了。
在ubuntu10.04中,当我们插入u盘时,会出现u盘设备,当我点击这个设备就可以mount上u盘,并读取里面的文件,当我们不使用时,我们再次点击这个设备就可以弹出这个设备,如果想再次使用U盘,那么就得必须再次插拔u盘才可以。
umount和弹出u盘是不同的,umount后我们还可以再次mount上使用,我们的u盘的设备还在,但弹出u盘后,我们想使用就的再此插入u 盘才可以。例如,我有个u盘,设备是sdb,里面有个分区sdb1,在弹出u盘后,我们使用fdisk来列出磁盘时就不会在看到sdb的设备了。
在linux下弹出u盘我们可以使用如下命令(例如我的u盘设备是sdb1):
sudo eject -s /dev/sdb1
这里可以查看eject的代码,提取出来就成这样了:
main.cpp文件如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
int fd = -1;
char *device;
if (argc != 2)
printf("usage: usb-s /dev/sde1");
return -1;
device = strdup(argv[1]);
if ((fd = open(device, O_RDONLY|O_NONBLOCK)) < 0)
printf("open device %s failed!\n", device);
free(device);
return -1;
int status, k;
sg_io_hdr_t io_hdr;
unsigned char allowRmBlk[6] = {ALLOW_MEDIUM_REMOVAL, 0, 0, 0, 0, 0};
unsigned char startStop1Blk[6] = {START_STOP, 0, 0, 0, 1, 0};
unsigned char startStop2Blk[6] = {START_STOP, 0, 0, 0, 2, 0};
unsigned char inqBuff[2];
unsigned char sense_buffer[32];
if ((ioctl(fd, SG_GET_VERSION_NUM, &k) < 0) || (k < 30000)) {
printf("not an sg device, or old sg driver\n");
goto out;
memset(&io_hdr, 0, sizeof(sg_io_hdr_t));
io_hdr.interface_id = 'S';
io_hdr.cmd_len = 6;
io_hdr.mx_sb_len = sizeof(sense_buffer);
io_hdr.dxfer_direction = SG_DXFER_NONE;
io_hdr.dxfer_len = 0;
io_hdr.dxferp = inqBuff;
io_hdr.sbp = sense_buffer;
io_hdr.timeout = 10000;
io_hdr.cmdp = allowRmBlk;
status = ioctl(fd, SG_IO, (void *)&io_hdr);
if (status < 0)
goto out;
io_hdr.cmdp = startStop1Blk;
status = ioctl(fd, SG_IO, (void *)&io_hdr);
if (status < 0)
goto out;
io_hdr.cmdp = startStop2Blk;
status = ioctl(fd, SG_IO, (void *)&io_hdr);
if (status < 0)
goto out;
/* force kernel to reread partition table when new disc inserted */
status = ioctl(fd, BLKRRPART);
close(fd);
free(device);
return 0;
编译和运行:
g++ -g -Wall main.cpp -o usb-s
现在,我们要弹出sdb1的u盘的话就可以这样了。
sudo usb-s /dev/sdb1
希望本文所述对大家的C++程序设计有所帮助。
usb
驱动分为通过
usb
fs操作
设备
的用户空间驱动,内核空间的内核驱动。两者不能同时进行,否则容易引发对共享资源访问的问题,死锁!使用了内核驱动,就不能在
usb
fs里驱动该
设备
。初次接触与OS相关的
设备
驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结当然不可缺,更何况我决定为嵌入式卖命了。好,言归正传,我说一说这段时间的收获,跟大家分享一下
Linux
的驱动开发。但这次只先针对Lin...
典型的 SCSI 通用驱动器命令对于字符
设备
,SCSI 通用驱动器支持许多典型的
系统
调用,比如 open()、close()、read()、write、poll() 和 ioctl()。向特定的 SCSI
设备
发送 SCSI 命令的步骤也非常简单:1.打开 SCSI 通用
设备
文件(比如 sg1)获取 SCSI
设备
的文件描述符。2.准备好 SCSI 命令。3.设置相关的内存缓冲区。4.调用 ioc...
Linux
弹出
U盘
的正确姿势(命令行)网上大多写帖子都是说umount /dev/sd* 之后就可以拔
出
U盘
,然而这和
弹出
操作还是有些差别的。umount只是卸载掉
设备
和挂载点直接的关联,而
U盘
此时还是可以查看到的(fdisk -l、lsblk等)这里是lsblk的挂载的结果sdc 8:32 1 14.4G 0 disk└─sdc1 8:33 1 1...
Small Computer Systems Interface (SCSI) 是一组标准集,它定义了与大量
设备
(主要是与存储相关的
设备
)通信所需的接口和协议。
Linux
® 提供了一种 SCSI 子
系统
,用于与这些
设备
通信。
Linux
是分层架构的一个很好的例子,它将高层的驱动器(比如磁盘驱动器或光驱)连接到物理接口,比如 Fibre Channel 或 Serial Attached SCSI...
Linux
弹出
U盘
的正确姿势(命令行)
网上大多写帖子都是说umount /dev/sd* 之后就可以拔
出
U盘
,然而这和
弹出
操作还是有些差别的。
umount只是卸载掉
设备
和挂载点直接的关联,而
U盘
此时还是可以查看到的(fdisk -l、lsblk等)
这里是lsblk的挂载的结果
sdc 8:32 1 14.4G 0 disk
└─sdc1 8:33 ...
本文实例讲述了
C++
实现
Linux
下弹
出
U盘
的
方法
。分享给大家供大家参考。具体如下:在
linux
下,对于
usb
设备
,我们一般都是mount上使用,不使用时umount掉就可以了。在ubuntu10.04中,当我们插入
u盘
时,会
出
现
u盘
设备
,当我点击这个
设备
就可以mount上
u盘
,并读取里面的文件,当我们不使用时,我们再次点击这个
设备
就可以
弹出
这个
设备
,如果想再次使用
U盘
,那么就得必须再次插拔
u盘
才...
<br />飞空静渡<br /> <br />在
linux
下,对于
usb
设备
,我们一般都是mount上使用,不使用时umount掉就可以了。<br />在ubuntu10.04中,当我们插入
u盘
时,会
出
现
u盘
设备
,当我点击这个
设备
就可以mount上
u盘
,并读取里面的文件,当我们不使用时,我们再次点击这个
设备
就可以
弹出
这个
设备
,如果想再次使用
U盘
,那么就得必须再次插拔
u盘
才可以。<br /> <br />umount和
弹出
u盘
是不同的,umount后我们还可以再次mount上使用,我们的
u盘
的
设备
还在,但
弹出