2007年8月20日星期一

关于fcntl()函数的cmd

关于fcntl()函数的cmd
函数如下:



#include int fcntl(int filedes, int cmd, ... /* int arg */ );




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()类似操作的时候是否依然有效,很遗憾,本人还没有搞清楚具体如何做。

没有评论: