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

代码如下:

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++程序设计有所帮助。

(0)

相关推荐

  • Linux中使用VS Code编译调试C++项目详解

    前言 关于VS Code在Linux下的安装这里就不提了,不管是CentOS还是Ubuntu,如果不懂且搜问题足够的情况下,你会解决的. 一.前置知识--gcc/g++的编译链接过程 在Windows下,如果你用Visual Studio进行开发,C/C++的编译器一般采用微软提供的MSBuild:在Linux下C/C++的编译器大多采用gcc/g++.既然要在Linux下进行C++开发,很有必要了解一下g++编译器的一些基本知识. 假设我现在有一个最简单的C++文件: #include <io

  • linux系统中c++写日志文件功能分享

    简化了glog,只保留了写日志文件的功能,只是改写了linux版本,win版本未改写,可以用LOG(INFO)<< 输出日志也可用LOG_IF(INFO,condition)<<输出日志也可直接调用日志类Logger::GetInstance().Error 等方式写日志初始化时调用 InitLogging(argv[0],INFO,"./log/test");第一个参数是路径,第二个参数是最低日志级别,第三个参数表示日志文件的前缀和文件夹 FileHelper

  • Linux下用C++实现俄罗斯方块

    本文实例为大家分享了C++实现俄罗斯方块游戏代码,供大家参考,具体内容如下 1.block.c #include <stdio.h> #include <termios.h> #include <unistd.h> #include <stdlib.h> #include <setjmp.h> #include <sys/time.h> #include <string.h> #include "block.h&

  • 总结UNIX/LINUX下C++程序计时的方法

    前言 良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序计时产生影响. 下面看看小编为大家整理几个计时方法 方法一: 如果是想统计某个程序的运行时间,那么可以使用 time ./a.out 方法二: 如果是想对某个函数或者语句进行计时,那么有别的方法.比如说,gettimeofday函数.直接贴示例代码: #include <sys/time.h> v

  • Linux C++ 使用condition实现阻塞队列的方法

    实例如下: /* * BlockingQueue.h * * Created on: 2014年6月10日 * Author: */ #ifndef BLOCKINGQUEUE_H_ #define BLOCKINGQUEUE_H_ #include <iostream> #include <pthread.h> using namespace std; //template <typename T > class BlockingQueue { public: Blo

  • Linux 平台上比较好的C/C++ IDE 清单

    "一个真正的程序员是不用IDE(译者注:集成开发环境)的,他们都是用带着某某插件的文本编辑器来写代码."我们总能在某些地方听到此类观点.然 而,尽管越来越多的人同意这样的观点,但是一个IDE仍然非常有用,它设置简单,使用起来也很方便,因此不能比这样更合适编写一个项目了.所以鉴于这点, 在这里我想给大家列一份在Linux平台上比较好的C/C++ IDE清单.为什么特地说C/C++呢?因为C语言是我最喜欢的编程语言,而且我们总要找个切入点来开始.另外要注意的是,通常有很多种编写C代码的方

  • Linux上搭建C/C++IDE开发环境

    文/张善友 Redhat linux上面没有提供Anjuta软件包,上面提供了一个Glade应用程序界面设计工具.Linux上面使用Anjuta和Glade以及Glademm软件包可以搭建一个linux下面进行C/C++软件开发的IDE环境,可以进行GTK+/Gnome的应用程序开发. 以前开发 Linux 程序时写出好的图形化用户界面比较难.在 GIMP 工具包 (GTK)诞生之后,这件事就变得比较容易了.当Damon Chaplin 写出 GLADE 这个用于在 GTK 环境下生成图形化用户

  • 在Linux下编译C或C++程序的教程

    从开始学习C/C++我们都在是windows下,那么如何(怎样)在linux中编译C/C++代码?在linux终端下(命令行中)编译译C/C++代码? 在任何linux分支下编译C/C++代码,如 Ubuntu ,Red Hat, Fedora ,Debian 以及其他linux分支上,我们需要安装一下软件包: 1.GNU C and C++ compiler collection 2.Development tools 3.Development libraries 4.IDE or text

  • 详解 linux c++的编译器g++的基本使用

    linux c++的编译器g++基本使用 g++是 linux下c++的编译器,在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件 2.将预处理后的文件不转换成汇编语言,生成文件.s 3.有汇编变为目标代码(机器代码)生成.o的文件 4.连接目标代码,生成可执行程序 g++ 编译c++经常使用的参数: -c 只编译,不连接.例如: g++ -c helloworld.cpp 只生成helloworld.o不连接 -o 指定输出文件名.例如:g++ -c helloworld.cpp

  • linux C++ 获取文件绝对路径的实例代码

    提供ftp服务时需要获取文件绝对路径,这里记录一下. #include <stdlib.h> #include <stdio.h> #include <limits.h> int main(){ const char *file_name = "filename"; char abs_path_buff[PATH_MAX]; //获取文件路径, 填充到abs_path_buff //realpath函数返回: null表示获取失败; 否则返回指向ab

随机推荐