定义
非阻塞I/O使我们可以调用open、read、write等I/O操作,并使这些操作不会永远阻塞。如果这种操作不能完成,则调用立即出错返回,表示该操作如继续执行将会阻塞。
方法
对于一个给定的描述符指定非阻塞I/O:
1,如果调用open获得描述符,则可指定O_NONBLOCK标志
2,对于已经打开的一个描述符,则可以调用fcntl,由该函数打开O_NONBLOCK文件状态标志。
示例
#include "apue.h"
#include <errno.h>
#include <fcntl.h>
char buf[500000];
int main(void)
{
int ntowrite,nwrite;
char *ptr;
set_fl(STDOUT_FILENO, O_NONEBLOCK);
ptr = buf;
while(ntowrite > 0)
{
errno = 0;
nwrite = write(STDOUT_FILENO, ptr, ntowrite);
fprintf(stderr, "nwrite = %d, errno= %d\n", nwrite, errno);
if(nwrite > 0)
{
prt += nwrite;
ntowrite -= nwrite;
}
}
clr_fl(STDOUT_FILENO, O_NONEBLOCK);
exit(0);
}
void set_fl(int fd, int flags)
{
int val;
if((val=fcntl(fd, F_GETFL, 0)) < 0)
err_sys("fcntl F_GETFL error");
val |= flags;
if(fcntl(fd, F_SETFL, val) < 0)
err_sys("fcnlt SETFL error");
}
void clr_fl(int fd, int flags)
{
int val;
if((val=fcntl(fd, F_GETFL, 0)) < 0)
err_sys("fcntl F_GETFL error");
val |= ~flags;
if(fcntl(fd, F_SETFL, val) < 0)
err_sys("fcnlt SETFL error");
}