fcntl函数中F_SETFL 设置文件描述词状态旗标,参数arg为新旗标,但只允许O_APPEND、O_NONBLOCK和O_ASYNC位的改变,其他位的改变将不受影响。
所以如果打开文件时是用非阻塞状态打开的:
open("/dev/tty",O_RDWR|O_NOCTTY|O_NDELAY);
则可以用fcntl改变文件状态标志:fcntl(fd, F_SETFL, 0);–改变文件为阻塞状态。
或者麻烦点,但易于理解:
1、获取文件的flags,即open函数的第二个参数:
flags = fcntl(fd,F_GETFL,0);
2、设置文件的flags:
fcntl(fd,F_SETFL,flags);
3、增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞:
flags = fcntl(fd,F_GETFL,0);
flags |= O_NONBLOCK;
fcntl(fd,F_SETFL,flags);
4、取消文件的某个flags,比如文件是非阻塞的,想设置成为阻塞:
flags = fcntl(fd,F_GETFL,0);
flags &= ~O_NONBLOCK;
fcntl(fd,F_SETFL,flags);
对普通文件的读写不存在阻塞问题,对和终端、网络连接等对应的文件描述符才会阻塞