在Linux系统中,一切都可以看成"文件",系统中所有的操作都可以通过文件I/O实现,因此,掌握文件常用接口很有必要。
0.前言
屏幕前的你如果懂得main函数传递参数机制,可以跳过本部分直接看后续内容。
在正式内容开始前,小编想讲述Linux中main函数传参的机制。
- linux中main函数抢先看:
int main(int argc , char* argv[])
函数参数说明:
- int arc:整型,表示传入参数的个数;
- char* argv[]:字符型数组,表示实际传入的参数,该参数还存在另一种定义方式,即char argv[][];
实际使用样例:
样例函数
#include int main(int argc,char*argv[]) { //打印参数个数 printf("argc:%d\n",argc); //遍历参数并且打印 printf("argv:"); for(int i=0;i 0) { //判断事件方式是否数输入方式 if(fds[0].revents == POLLIN) { //数据读取完成后返回 while(read(fd,&event,sizeof(event))==sizeof(event)) { printf("get event:type=0x%x code=0x%x value=0x%x\n",event.type,event.code,event.value); } } } else if(res == 0) { printf("time out\n"); } else { printf("poll err\n"); } } return 0; }
异步通知方式
异步通知方式,文件是以非阻塞方式打开的,在初始化设置完成后,当没有读取到数据时,程序可以干其他的事,读取数据操作并不影响程序的其他操作。看到这儿,大家是不是觉得这种处理方式很类似于单片机的中断处理函数。:smile_cat::smile_cat::smile_cat:
异步通知方式,使用了信号量,信号量在此处的作用是通知驱动程序是否能够成功读取数据,能够成功读取数据后,驱动就读取数据;否则就将其闲置在一旁。
代码
#include #include #include #include #include #include #include #include #include #include int fd = 0; struct input_event event; void my_sig_handler(int sing) { while(read(fd,&event,sizeof(event))==sizeof(event)) { printf("get event:type=0x%x code=0x%x value=0x%x\n", event.type,event.code,event.value); } } int main(int argc, char const *argv[]) { int fd2 = 0; int err = 0; struct input_id id; unsigned int evbit[2]; int len,res; struct input_event event2; struct pollfd fds[2]; nfds_t nfds = 2; unsigned int count = 0,flags; //判断参数个数是不是2 一个运行参数 一个文件设备 if (argc != 2) { printf("Usage: %s \n", argv[0]); return -1; } /* 注册信号处理函数 */ signal(SIGIO, my_sig_handler); /* 打开驱动程序 */ fd = open(argv[1], O_RDWR | O_NONBLOCK); if (fd < 0) { printf("open %s err\n", argv[1]); return -1; } /* 把APP的进程号告诉驱动程序 */ fcntl(fd, F_SETOWN, getpid()); /* 使能"异步通知" */ flags = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, flags | FASYNC); while(1) { //主进程干的活 printf("count:%d\n",count++); sleep(2); } return 0; }
3.小结
尽管,上文的四种文件访问方式各有优劣,但只要在合适的时机使用就能够发挥其最大效率!