Linux下弹出U盘的代码
来源:互联网 发布:数据挖掘技术 编辑:程序博客网 时间:2024/05/17 22:56
转自http://www.oschina.net/code/snippet_4873_2205
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
01
#include <stdio.h>
02
#include <stdlib.h>
03
#include <unistd.h>
04
#include <sys/types.h>
05
#include <sys/ioctl.h>
06
#include <fcntl.h>
07
#include <string.h>
08
#include <linux/fd.h>
09
#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
{
15
int
fd = -1;
16
char
*device;
17
if
(argc != 2)
18
{
19
printf
(
"usage: usb-s /dev/sde1"
);
20
return
-1;
21
}
22
device = strdup(argv[1]);
23
if
((fd = open(device, O_RDONLY|O_NONBLOCK)) < 0)
24
{
25
printf
(
"open device %s failed!\n"
, device);
26
free
(device);
27
return
-1;
28
}
29
30
int
status, k;
31
sg_io_hdr_t io_hdr;
32
unsigned
char
allowRmBlk[6] = {ALLOW_MEDIUM_REMOVAL, 0, 0, 0, 0, 0};
33
unsigned
char
startStop1Blk[6] = {START_STOP, 0, 0, 0, 1, 0};
34
unsigned
char
startStop2Blk[6] = {START_STOP, 0, 0, 0, 2, 0};
35
unsigned
char
inqBuff[2];
36
unsigned
char
sense_buffer[32];
37
if
((ioctl(fd, SG_GET_VERSION_NUM, &k) < 0) || (k < 30000)) {
38
printf
(
"not an sg device, or old sg driver\n"
);
39
goto
out;
40
}
41
memset
(&io_hdr, 0,
sizeof
(sg_io_hdr_t));
42
io_hdr.interface_id =
'S'
;
43
io_hdr.cmd_len = 6;
44
io_hdr.mx_sb_len =
sizeof
(sense_buffer);
45
io_hdr.dxfer_direction = SG_DXFER_NONE;
46
io_hdr.dxfer_len = 0;
47
io_hdr.dxferp = inqBuff;
48
io_hdr.sbp = sense_buffer;
49
io_hdr.timeout = 10000;
50
io_hdr.cmdp = allowRmBlk;
51
status = ioctl(fd, SG_IO, (
void
*)&io_hdr);
52
if
(status < 0)
53
{
54
goto
out;
55
}
56
io_hdr.cmdp = startStop1Blk;
57
status = ioctl(fd, SG_IO, (
void
*)&io_hdr);
58
if
(status < 0)
59
{
60
goto
out;
61
}
62
io_hdr.cmdp = startStop2Blk;
63
status = ioctl(fd, SG_IO, (
void
*)&io_hdr);
64
if
(status < 0)
65
{
66
goto
out;
67
}
68
/* force kernel to reread partition table when new disc inserted */
69
status = ioctl(fd, BLKRRPART);
70
out:
71
close(fd);
72
free
(device);
73
return
0;
74
}
[代码] 编译和运行
1
编译:g++ -g -Wall main.cpp -o usb-s
2
3
现在,我们要弹出sdb1的u盘的话就可以这样了。
4
5
sudo
usb-s /dev/sdb1
- Linux下弹出U盘的代码
- Linux下弹出U盘的代码
- C++实现Linux下弹出U盘的方法
- 弹出U盘代码
- Linux下U盘的使用
- Linux下u盘的使用
- linux下u盘的挂载
- Linux 下 U盘的使用方法
- Linux下U盘的挂载
- Linux 下的U盘挂载
- U盘无法弹出的有效解决方法
- ubuntu的弹出U盘/移动硬盘
- Ubuntu下U盘/移动硬盘“卸载、弹出、Safely Remove Drive”的区别
- linux下制作linux系统的安装U盘
- linux下制作linux安装启动u盘的过程
- linux下格式化u盘
- linux下识别U盘
- Linux下挂U盘
- Activity和Intent
- 银行业务调度系统
- Android反编译xml文件
- linux automake
- 浅析 Java Thread.join()
- Linux下弹出U盘的代码
- Android Activity生命周期(图文)!
- 性格色彩测试android程序开发之八--测试题的实现
- 基于 Android NDK 的学习之旅----- Java 方法映射到C中的签名
- 异步消息处理 handler
- IE6支持PNG
- Cscope : 当前下有目录不想要怎么办
- javascript关于正则一
- truncate table与 delete的区别