Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15515328
  • 博文数量: 112
  • 博客积分: 11195
  • 博客等级: 上将
  • 技术积分: 1989
  • 用 户 组: 普通用户
  • 注册时间: 2005-06-20 11:04
文章分类

全部博文(112)

文章存档

2013年(2)

2012年(27)

2011年(6)

2010年(11)

2009年(6)

2007年(7)

2006年(23)

2005年(30)

分类: LINUX

2006-07-20 18:00:49

函数如下:

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


 

阅读(99149) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~