C++实现Linux下弹出U盘的方法
本文实例讲述了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):
sudoeject-s/dev/sdb1
这里可以查看eject的代码,提取出来就成这样了:
main.cpp文件如下:
#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>
intmain(intargc,char*argv[])
{
intfd=-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("opendevice%sfailed!\n",device);
free(device);
return-1;
}
intstatus,k;
sg_io_hdr_tio_hdr;
unsignedcharallowRmBlk[6]={ALLOW_MEDIUM_REMOVAL,0,0,0,0,0};
unsignedcharstartStop1Blk[6]={START_STOP,0,0,0,1,0};
unsignedcharstartStop2Blk[6]={START_STOP,0,0,0,2,0};
unsignedcharinqBuff[2];
unsignedcharsense_buffer[32];
if((ioctl(fd,SG_GET_VERSION_NUM,&k)<0)||(k<30000)){
printf("notansgdevice,oroldsgdriver\n");
gotoout;
}
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)
{
gotoout;
}
io_hdr.cmdp=startStop1Blk;
status=ioctl(fd,SG_IO,(void*)&io_hdr);
if(status<0)
{
gotoout;
}
io_hdr.cmdp=startStop2Blk;
status=ioctl(fd,SG_IO,(void*)&io_hdr);
if(status<0)
{
gotoout;
}
/*forcekerneltorereadpartitiontablewhennewdiscinserted*/
status=ioctl(fd,BLKRRPART);
out:
close(fd);
free(device);
return0;
}
编译和运行:
编译:
g++-g-Wallmain.cpp-ousb-s
现在,我们要弹出sdb1的u盘的话就可以这样了。
sudousb-s/dev/sdb1
希望本文所述对大家的C++程序设计有所帮助。