LINUX系统识别外设(基于C的自动读写)(LINUX模拟U盘)【二】

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}

以下是运行结果:

猜你喜欢

转载自blog.csdn.net/wjb123sw99/article/details/82918301