目錄html
Linux NIO 系列(03) 非阻塞式 IO編程
Netty 系列目錄(http://www.javashuo.com/article/p-hskusway-em.html)函數
阻塞和非阻塞 I/O 是設備訪問的兩種不一樣模式,驅動程序能夠靈活地支持這兩種用戶空間對設備的訪問方式。code
通常咱們在 open() 文件或打開文件後經過 iocntl() 或 fcntl() 函數都是使用設置是否採用阻塞方式打開。默認都是阻塞方式打開的,若是要使用非阻塞方式打開,則在須要顯式的加入 O_NONBLOCK 標誌htm
在 BSD 套接字編程中,彷佛將文件描述符設置爲非阻塞 I/O 模式的推薦方式是使用 PLACEHOLDER_FOR_CODE_l 標誌到 fcntl(),例如:blog
int flags = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flags | O_NONBLOCK);
在 UNIX 使用 FIONBIO ioctl() 調用來執行此操做:get
int opt = 1; ioctl(fd, FIONBIO, &opt);
非阻塞方式訪問的方式中,最多見的就是輪詢方式,即不停的輪詢 IO 是否可用,當可用時再讀取。固然不停經過讀來輪詢的方式並非好的方式。系統把這個功能交給了 select 和 poll 系統調用來實現了。it
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main(int argc,char *argv[]) { char buf[2]; /* 非阻塞方式打開 */ int fd = open("/dev/button", O_RDWR | O_NONBLOCK); if(fd < 0) { printf("open /dev/%s fail\n",argv[1]); return -1; } while(1) { read(fd, buf, 1); printf("buf = %d, \n", buf[0]); } close(fd); return 0; }
天天用心記錄一點點。內容也許不重要,但習慣很重要!io