您的位置:首页 > 运维架构 > Linux

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

2016-07-13 18:08 483 查看
转载http://www.jb51.net/article/69806.htm

 

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/ioctl.h>

#include <fcntl.h>

#include <string.h>

#include <linux/fd.h>

#include <sys/mount.h>

#include <scsi/scsi.h>

#include <scsi/sg.h>

#include <scsi/scsi_ioctl.h>

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);

out:

  close(fd);

  free(device);

  return 0;

}

 

运行

g++ -g -Wall main.cpp -o usb-s
sudo usb-s /dev/sdb1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: