本文实例讲述了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盘 设备 还在,但 弹出