本章涵盖了从多概念和函数:非阻塞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 }
View Code

相关文章: