gpt4 book ai didi

c - 在 Linux 中设置 FD 标志

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:48:57 25 4
gpt4 key购买 nike

我的印象是 fcntl(fd, F_SETFD, flg )flg = fcntl(fd, F_GETFD, flg ) 可用于设置和获取文件描述符标志。

根据 https://community.spiceworks.com/linux/man/2/fcntl ,linux应该只支持部分fd标志的设置。很公平。但从输出判断:

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>

#define XSZ(x) (int)(sizeof(x)*2)
int main(int argc, char** argv){
int fd, flg;
if ( (fd = open("/dev/stdout", O_RDWR )) < 0){ perror("open"); return -errno; }

//get
if ( (flg = fcntl(fd, F_GETFD)) < 0 ){ perror("setfd"); return -errno; }
printf("flg=0x%0*x\n", XSZ(flg), flg);

#define ADD_FLAG(FLG) \
flg |= FLG;\
printf("setting flg=0x%0*x\n", XSZ(flg), flg);\
if ( (flg = fcntl(fd, F_SETFD, flg )) ){ perror("setfd"); return -errno; }\
if ( (flg = fcntl(fd, F_GETFD, flg )) < 0 ){ perror("getfd"); return -errno; }\
printf("flg=0x%0*x\n\n", XSZ(flg), flg);

ADD_FLAG(FD_CLOEXEC);
ADD_FLAG(O_APPEND);
ADD_FLAG(O_DIRECT);
ADD_FLAG(O_ASYNC);
ADD_FLAG(O_NOATIME);

return 0;
}

存在

flg=0x00000000
setting flg=0x00000001
flg=0x00000001

setting flg=0x00000401
flg=0x00000001

setting flg=0x00004001
flg=0x00000001

setting flg=0x00002001
flg=0x00000001

setting flg=0x00040001
flg=0x00000001

看起来唯一可设置的标志是 FD_CLOEXEC。(奇怪的是:所有 set 调用都返回成功)。

在我看来,内核几乎忽略了 F_SETFD 的参数:

https://github.com/torvalds/linux/blob/master/fs/fcntl.c#L259

这是怎么回事?我错过了什么吗?

最佳答案

F_SETFD 的唯一有效标志 FD_CLOEXEC;您使用的所有其他内容都用于 F_SETFL。当 F_SETFD 被传递给不存在的标志的任何值时,Linux 和 POSIX 都没有指定任何错误,因此预计这种情况不会导致错误。

关于c - 在 Linux 中设置 FD 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37894473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com