日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2024/4/18 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌入式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_SIZE 1024 /* 緩沖區大小*/ #define IN_FILES 3 /* 多路復用輸入文件數目*/ #define TIME_DELAY 60 /* 超時時間秒數 */ #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

總結

以上是生活随笔為你收集整理的嵌入式Linux基础学习笔记-文件IO编程-I/O多路复用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。