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

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

#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

 
现在,我们要弹出sdb1的u盘的话就可以这样了。

复制代码 代码如下:

sudo usb-s /dev/sdb1

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索linux
, c++
弹出U盘
linux c语言实现ls、linux c语言实现shell、linux c语言实现ping、c语言实现linux命令、linux c语言下实现ls,以便于您获取更多的相关知识。

时间: 2024-10-15 00:43:18

C++实现Linux下弹出U盘的方法_C 语言的相关文章

JS实现从网页顶部掉下弹出层效果的方法_javascript技巧

本文实例讲述了JS实现从网页顶部掉下弹出层效果的方法.分享给大家供大家参考.具体如下: 这里介绍的JavaScript动画背景出层,实现从网页顶部掉下来的感觉,停止时还带有缓冲弹跳的意思,从上到下显示的动画弹出层,带关闭功能,没有怎么美化,喜欢的用时候息动手美化下,觉得不错. 运行效果如下图所示: 具体代码如下: <HTML><HEAD><TITLE>窗口从上掉下来</TITLE> </HEAD> <BODY bgColor=#fef4d9

linux下实现的2048游戏示例分享_C 语言

my2048.c 复制代码 代码如下: #include"my_getch.h"#include"math.h"#include"time.h" #define SPACE() printf("    ")#define RED_NUM(n) printf("\033[;31m%4d",(n))#define GREEN_NUM(n) printf("\033[;32m%4d",(n))

基于linux下获取时间函数的详解_C 语言

//-------------------------------------------------------------//asctime(将时间和日期以字符串格式表示)#include<time.h>定义函数char * asctime(const struct tm * timeptr);函数说明asctime()将参数timeptr所指的tm结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回.此函数已经由时区转换成当地时间,字符串格式为:"We

基于Linux系统调用--getrlimit()与setrlimit()函数的方法_C 语言

功能描述:获取或设定资源使用限制.每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值.非授权调用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制.授权进程可以任意改变其软硬限制.RLIM_INFINITY的值表示不对资源限制.用法: 复制代码 代码如下: #include <sys/resource.h>int getrlimit(int resource, struct rlimit *rlim);int setrlimit

解决不用sizeof求出int大小的方法_C 语言

代码如下所示: 复制代码 代码如下: #include <stdio.h>  int main(int argc, char *argv[])  {      int a[2];      unsigned int add1 = &a[0];      unsigned int add2 = &a[1];      printf("The address of a[0] is %u/n",add1);      printf("The addres

VC下实现fopen支持中文的方法_C 语言

VC的fopen函数第一个参数是const char*,一旦遇到中文文件名就难以应付了,如果中文是UTF8编码的话,我们还可以用下列代码将其转换为UNICODE,然后用_wfopen函数打开文件. 代码如下: bool UTF8ToUnicode(const char* UTF8, wchar_t* strUnicode) { DWORD dwUnicodeLen; //转换后Unicode的长度 TCHAR *pwText; //保存Unicode的指针 // wchar_t* strUnic

解析在WTL下使用双缓冲的实现方法_C 语言

使用WTL的CDoubleBufferImpl类可以方便的实现双缓冲,而不必自己实现繁琐的代码,不仅可以绘制一般窗口,也可以绘制对话框的背景等.首先 #include <atlframe.h>其次需要双缓冲画图的类需要派生自CDoubleBufferImpl<>:class CMainDlg : public CDialogImpl<CMainDlg>, public CDoubleBufferImpl<CMainDlg>{}然后消息链中加入BEGIN_MS

解决win7系统下安全弹出U盘出现电脑重启的问题方法

  U盘是一种能够方便用户便携式存储数据的设备,U盘在我们的生活中较为广泛被使用,不过有些用户在win7系统下使用U盘时进行备份或转移资料后,在不使用U盘时,使用安全弹出U盘时出现电脑自动重启的问题,对于该奇葩问题很多用户表示不解,故此小编针对遇到该问题的用户提供了解决方法,需要的用户赶快试试吧! 解决win7系统下安全弹出U盘出现电脑重启的问题方法 1.返回到桌面位置,找到"这台电脑"图标,直接鼠标右键点击这台电脑,在出现的菜单里面选中选择设备管理器选项. 2.这样就能够打开win8

Mac电脑如何安全弹出U盘或移动硬盘?

  U盘插入Mac后为了让U盘安全的弹出,该如何操作呢?第一次使用Mac系统的用户朋友可能会遇到这样的疑问,为了保障U盘或移动硬盘里面的资料安全,随手安全弹出U盘设备是一个好习惯,下面小编就教大家在Mac电脑上如何安全弹出U盘或移动硬盘. 1.如果你已经正常插入了U盘,那么在你的MAC系统中的桌面上便会有一个图标 2.方法一 在该盘符的图标上点击鼠标右键,我们发现有"退出XXX"字样的选项,点击后U盘的盘符消失那么大家应该已经明白! Mac OS中是能实现直接对U盘的盘符图标操作安全弹