This article describes the C + + implementation of Linux eject U disk method. Share to everyone for your reference. Specifically as follows:
In Linux, for USB devices, we are generally used on mount, do not use when umount off on it.
In the ubuntu10.04, when we insert the U disk, will appear U disk equipment, when I click on this device can mount U disk, and read the file inside, when we do not use, we again click on this device can eject this device, if you want to use the U disk again, then you have to plug the U plate again before you can.
Umount and eject u disk is different, after umount we can again mount on the use, our U disk device is still in, but after the U disk, we want to use the Insert U disk before you can. For example, I have a U disk, the device is SDB, there is a partition sdb1, after the U disk is ejected, we will not see the SDB device when we use FDISK to list the disk.
Eject the U disk under Linux we can use the following command (for example, my U disk device is SDB1):
Copy Code code as follows:
Here you can look at the eject code and extract it:
main.cpp files are as follows:
#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 a 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/status = inserted (FD, IOCTL);
Out:close (FD);
Free (device);
return 0;
}
Compile and run:
Compile:
Copy Code code as follows:
g++-g-wall Main.cpp-o usb-s
Now we're going to pop the SDB1 u disk and that's it.
Copy Code code as follows:
I hope this article will help you with the C + + program design.