关于fcntl()函数的cmd

本文探讨了使用fcntl函数设置文件描述符为非阻塞模式时的常见错误。作者最初尝试将F_SETFD用于此目的,但未能成功,之后发现正确的做法是使用F_SETFL。文章还解释了文件描述符标志与文件状态标志的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数如下:

 

#include <fcntl.h>

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

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值