首页 > 编程 > C++ > 正文

C++实现Linux下弹出U盘的方法

2020-05-23 14:17:44
字体:
来源:转载
供稿:网友
这篇文章主要介绍了C++实现Linux下弹出U盘的方法,实例分析了C++在Linux平台上进行IO操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
 

本文实例讲述了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文件如下:
 

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <unistd.h> 
  4. #include <sys/types.h> 
  5. #include <sys/ioctl.h> 
  6. #include <fcntl.h> 
  7. #include <string.h> 
  8. #include <linux/fd.h> 
  9. #include <sys/mount.h> 
  10. #include <scsi/scsi.h> 
  11. #include <scsi/sg.h> 
  12. #include <scsi/scsi_ioctl.h> 
  13. int main(int argc, char *argv[]) 
  14.   int fd = -1; 
  15.   char *device; 
  16.   if (argc != 2) 
  17.   { 
  18.     printf("usage: usb-s /dev/sde1"); 
  19.     return -1; 
  20.   } 
  21.   device = strdup(argv[1]); 
  22.   if ((fd = open(device, O_RDONLY|O_NONBLOCK)) < 0) 
  23.   { 
  24.     printf("open device %s failed!/n", device); 
  25.     free(device); 
  26.     return -1; 
  27.   } 
  28.   int status, k; 
  29.   sg_io_hdr_t io_hdr; 
  30.   unsigned char allowRmBlk[6] = {ALLOW_MEDIUM_REMOVAL, 0, 0, 0, 0, 0}; 
  31.   unsigned char startStop1Blk[6] = {START_STOP, 0, 0, 0, 1, 0}; 
  32.   unsigned char startStop2Blk[6] = {START_STOP, 0, 0, 0, 2, 0}; 
  33.   unsigned char inqBuff[2]; 
  34.   unsigned char sense_buffer[32]; 
  35.   if ((ioctl(fd, SG_GET_VERSION_NUM, &k) < 0) || (k < 30000)) { 
  36.    printf("not an sg device, or old sg driver/n"); 
  37.    goto out; 
  38.   } 
  39.   memset(&io_hdr, 0, sizeof(sg_io_hdr_t)); 
  40.   io_hdr.interface_id = 'S'
  41.   io_hdr.cmd_len = 6; 
  42.   io_hdr.mx_sb_len = sizeof(sense_buffer); 
  43.   io_hdr.dxfer_direction = SG_DXFER_NONE; 
  44.   io_hdr.dxfer_len = 0; 
  45.   io_hdr.dxferp = inqBuff; 
  46.   io_hdr.sbp = sense_buffer; 
  47.   io_hdr.timeout = 10000; 
  48.   io_hdr.cmdp = allowRmBlk; 
  49.   status = ioctl(fd, SG_IO, (void *)&io_hdr); 
  50.   if (status < 0) 
  51.   { 
  52.    goto out; 
  53.   } 
  54.   io_hdr.cmdp = startStop1Blk; 
  55.   status = ioctl(fd, SG_IO, (void *)&io_hdr); 
  56.   if (status < 0) 
  57.   { 
  58.    goto out; 
  59.   } 
  60.   io_hdr.cmdp = startStop2Blk; 
  61.   status = ioctl(fd, SG_IO, (void *)&io_hdr); 
  62.   if (status < 0) 
  63.   { 
  64.    goto out; 
  65.   } 
  66.   /* force kernel to reread partition table when new disc inserted */ 
  67.   status = ioctl(fd, BLKRRPART); 
  68. out: 
  69.   close(fd); 
  70.   free(device); 
  71.   return 0; 
?

编译和运行:

编译:

复制代码代码如下:
g++ -g -Wall main.cpp -o usb-s

 
现在,我们要弹出sdb1的u盘的话就可以这样了。
复制代码代码如下:
sudo usb-s /dev/sdb1

 

希望本文所述对大家的C++程序设计有所帮助。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表