本章涵盖了从多概念和函数:非阻塞I/O、记录锁、I/O多路转换、异步I/O、readv和writev函数以及存储映射I/O
非阻塞I/O
非阻塞I/O使我们可以发出open、read和write这样的I/O操作,并使这些操作不会永远阻塞。如果这种操作不能完成,则调用立即返回出错。
对于一个给定的文件描述符,有两种为其制定非阻塞I/O的方法:
1.如果调用open获得描述符,则可制定O_NONBLOCK标志(第三章)
2.对于已经打开的一个描述符,则可调用fcntl,由该函数打开O_NONBLOCK文件状态标志
下面程序时一个非阻塞I/O的实例
1 #include "apue.h" 2 #include <errno.h> 3 #include <fcntl.h> 4 5 char buf[500000]; 6 7 int 8 main(void) 9 { 10 int ntowrite, nwrite; 11 char *ptr; 12 13 ntowrite = read(STDIN_FILENO, buf, sizeof(buf)); 14 fprintf(stderr, "read %d bytes\n", ntowrite); 15 16 set_fl(STDOUT_FILENO, O_NONBLOCK); /* set nonblocking */ 17 18 ptr = buf; 19 while (ntowrite > 0) { 20 errno = 0; 21 nwrite = write(STDOUT_FILENO, ptr, ntowrite); 22 fprintf(stderr, "nwrite = %d, errno = %d\n", nwrite, errno); 23 24 if (nwrite > 0) { 25 ptr += nwrite; 26 ntowrite -= nwrite; 27 } 28 } 29 30 clr_fl(STDOUT_FILENO, O_NONBLOCK); /* clear nonblocking */ 31 32 exit(0); 33 }