可以使用如下方法对文件描述符设置非阻塞模式:
fl = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, fl | O_NONBLOCK);
当设置了O_NONBLOCK标志的文件描述符有可能发生阻塞时,会返回一个错误,而不会发生实质上的阻塞。
一般的输入输出程序都没有预想到这种行为,因此发生这样的错误就会被认为失败,从而引发输入输出操作的整体失败。
使用O_NONBLOCK标志时,一定要注意文件描述符的使用。O_NONBLOCK标志会继承给子进程,因此在使用fork的时候要尤其注意。
以前曾经遇到过这样的bug: 1、对标准输入设置了O_NONBLOCK;2、用system启动命令;3、命令不支持O_NONBLOCK,导致诡异的错误。
那时,由于忘记了子进程会继承O_NONBLOCK标志这件事,结果花了大量的时间才找到错误的原因。