分类: LINUX
2006-07-20 18:00:49
#include |
Returns: depends on cmd if OK (see following), 1 on error |
下午的时候遇到一个非常奇怪的问题,就是对一个文件描述符设置了非阻塞方式但write()这个描述符的时候却还是会阻塞,于是感到非常郁闷。这个描述符是通过socket()建立的一个PF_UNIX套接字,由于对这种类型的套接字不是很熟悉,所以猜想是他不支持非阻塞方式,结果后来弄明白了,错误出在cmd上面了。
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; /* turn on flags */ if (fcntl(fd, F_SETFL, val) < 0) err_sys("fcntl F_SETFL error"); } |
上面是教科书上的用法,错误也出在这里,错误地将F_SETFL换成了F_SETFD,下面我们来看看FD和FL的差别:
F_GETFD |
Return the file descriptor flags for filedes as the value of the function. |
F_SETFD |
Set the file descriptor flags for filedes. |
F_GETFL |
Return the file status flags for filedes as the value of the function. |
F_SETFL |
Set the file status flags to the value of the third argument (taken as an integer). |
当时我错误的理解修改文件描述符的非阻塞方式应该是修改file descriptor的flag,但是实际上需要修改的是file status的flag。
一个是file descriptor一个是file status,虽然到现在依然很别扭,但是事情已经发生了:(,我们可以这样理解file descriptor的flag指的是仅仅只是它本身的一些状态(实际上它只有一个标志可以修改),而file status的状态才是它是否阻塞,是否同步异步读写,是否可读可写等标志。对于FD_SETFL大家都比较熟悉了,那么对于FD_SETFD有什么用呢?设置他有什么效果呢?别着急,听我慢慢道来:
在很久很久以前,有一个....(靠,哪里来的西红柿~~)
就是设置这个文件描述符在程序里面有exec()类似操作的时候是否依然有效,很遗憾,本人还没有搞清楚具体如何做。