700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 嵌入式Linux基础学习笔记-文件IO编程-I/O多路复用

嵌入式Linux基础学习笔记-文件IO编程-I/O多路复用

时间:2019-09-07 07:08:28

相关推荐

嵌入式Linux基础学习笔记-文件IO编程-I/O多路复用

实验内容:多路复用—I/O操作及阻塞

编程实现文件描述符集合的监听

multiplex_poll.c文件编写:

/* multiplex_poll.c */#include <fcntl.h>#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <errno.h>#include <poll.h>#define MAX_BUFFER_SIZE1024/* 缓冲区大小*/#define IN_FILES3/* 多路复用输入文件数目*/#define TIME_DELAY60/* 超时时间秒数 */#define MAX(a, b)((a > b)?(a):(b))int main(void){struct pollfd fds[IN_FILES];char buf[MAX_BUFFER_SIZE];int i, res, real_read, maxfd;/*首先按一定的权限打开两个源文件*/fds[0].fd = 0;if((fds[1].fd = open ("in1", O_RDONLY|O_NONBLOCK)) < 0){printf("Open in1 error\n");return 1;}if((fds[2].fd = open ("in2", O_RDONLY|O_NONBLOCK)) < 0){printf("Open in2 error\n");return 1;}for (i = 0; i < IN_FILES; i++){fds[i].events = POLLIN;}/*循环测试该文件描述符是否准备就绪,并调用poll函数对相关文件描述符做对应操作*/while(fds[0].events || fds[1].events || fds[2].events){if (poll(fds, IN_FILES, 0) < 0) {printf("Poll error\n");return 1;}for (i = 0; i< IN_FILES; i++){if (fds[i].revents){memset(buf, 0, MAX_BUFFER_SIZE);real_read = read(fds[i].fd, buf, MAX_BUFFER_SIZE);if (real_read < 0){if (errno != EAGAIN){return 1;}}else if (!real_read){close(fds[i].fd);fds[i].events = 0;}else{if (i == 0){if ((buf[0] == 'q') || (buf[0] == 'Q')){return 1;}}else{buf[real_read] = '\0';printf("%s", buf);}} /* end of if real_read*/} /* end of if revents */} /* end of for */} /*end of while */exit(0);}

运行时,需要打开3个虚拟终端,分别创建两个管道文件in1和in2,运行主程序

终端1:

mknod in1 p

cat >in1

multiplex call

test in1

end

终端2:

mknod in2 p

multiplex call

test in2

end

终端3:

./multiplex_poll

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。