版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wjb123sw99/article/details/82918301
前言
最近在开发基于量子随机数的离线密钥充值系统,主要功能是对外设进行充值随机数密钥。软件部署在centos7系统上,因此需要软件自动识别系统是否有外设通过USB口接入设备。
在上一章中我简单介绍了如何去对linux系统中的外来存储设备进行读写操作,在本章中我将继续讲解,并提供相应的源码作例子
模拟U盘
由于学习过程中,你可能没有实际的外设进行演练,因此博主写了一份脚本文件用作LINUX下模拟U盘的插入和拔出。以下是源码部分:
usb文件脚本代码如下:
#! /bin/bash
echo "1:Analog peripheral insertion"
echo "2:Analog peripheral pull out"
echo "Please Enter:"
read num
if [ "$num" = "1" ]
then
if [ -d "/media/usb" ]
then
echo "Inter a peripheral"
else
echo "Inter a peripheral"
mkdir "/media/usb"
fi
dd if=/dev/zero of=/dev/a.bin bs=1 count=102400
mkfs.vfat /dev/a.bin
mount /dev/a.bin /media/usb
df -h
exit 1
fi
if [ "$num" = "2" ]
then
if [ -d "/media/usb" ]
then
echo "pull out a peripheral"
umount /media/usb
rm -rf /media/usb
rm -rf /dev/a.bin
fi
exit 2
fi
echo "you enter error"
使用方式:
1:运行脚本./usb
2:输入1,即生成模拟U盘,大小为102kb
3 :输入2,即卸载U盘
C代码自动读写U盘
实现自动读写U盘的思路:
1:首先找到外设的挂载路径
2:打开该路径,即可实现代码级别的读写
以下是代码部分:
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int get_info_value(char **info, char *value)
{
char *vernier = 0;
int i=0;
vernier = *info;
while( *vernier == ' ' || *vernier == '\n')
{
vernier++;
}
for(i=0; *vernier !=32 && *vernier != '\n' && *vernier != '\0' && i<64; i++)
{
value[i] = *vernier;
vernier++;
}
if(*vernier == '\0')
{
return 0;
}
*info = vernier;
return 1;
}
/* 获取路径 */
void analysis_dev_info(char *buf, char *path)
{
char *info=buf;
char value[128]={0};
int ret=1;
printf("@buf %s", buf);
while(0!=ret)
{
sprintf(path, "%s", value);
memset(value, 0, sizeof(value));
ret=get_info_value(&info, value);
}
}
int write_path(char *path, char* buf)
{
int fd=open(path, O_CREAT|O_RDWR|O_NONBLOCK|O_TRUNC, 0777);
if(fd<0)
{
printf("open error\n");
return -1;
}
write(fd, buf, strlen(buf));
close(fd);
return 0;
}
int read_path(char *path, char* buf)
{
int fd=open(path, O_CREAT|O_RDWR|O_NONBLOCK|O_TRUNC, 0777);
if(fd<0)
{
printf("open error\n");
return -1;
}
read(fd, buf, strlen(buf));
close(fd);
return 0;
}
int main()
{
int fd=0,ret=0,n=0;
char buf[1024]={0};
char path[128]={0};
fd=open("./extendevinfo.txt", O_CREAT|O_RDWR|O_NONBLOCK|O_TRUNC, 0777);
if(fd<0)
{
printf("open error\n");
return -1;
}
ret=system("df -h |grep media >./extendevinfo.txt");
if(ret)
{
printf("sysytem error\n");
return -1;
}
n=read(fd, buf, sizeof(buf));
if(n<2)
{
printf("read error\n");
return -1;
}
analysis_dev_info(buf, path);
sprintf(path, "%s/test.txt", path);
printf("@path %s\n", path);
write_path(path, "hello world");
close(fd);
}
以下是运行结果: