gpt4 book ai didi

c - Linux C,为什么 fcntl 作用于 STDIN 也会影响 STDOUT 和 STDERR?

转载 作者:可可西里 更新时间:2023-11-01 11:49:26 28 4
gpt4 key购买 nike

当我将 stdin FD 状态标志设置为 O_NONBLOCK< 时,我在 stdin 上执行函数 fcntl 时遇到了问题,效果很好,但有副作用。 stdout 和 stderr 的状态标志也已更改为 O_NONBLOCK

我研究了函数fcntlSYSCALL_DEFINE3do_fcntl 的源代码,但没有任何帮助。还有 stackoverflow 或谷歌。我认为它可能与内核或 glibc 实现有关。

我的电脑是 x86_64 上的 Ubuntu 12.04,安装了 gcc 4.6.3。

  int flag = 0;
int value = O_NONBLOCK;
int fd = open("./tmp", O_RDONLY);

if(-1 == (flag = fcntl(fd, F_GETFL)))
fprintf(stdout, "%d:%s\n", errno, strerror(errno));

flag = fcntl(stdin->_fileno, F_GETFL);
flag = fcntl(stderr->_fileno, F_GETFL);
if(-1 == (flag = fcntl(stdout->_fileno, F_GETFL)))
fprintf(stdout, "%d:%s\n", errno, strerror(errno));

flag = fcntl(stdout->_fileno, F_SETFL, flag | O_NONBLOCK);

flag = fcntl(fd, F_GETFL);
flag = fcntl(stdin->_fileno, F_GETFL);
flag = fcntl(stdout->_fileno, F_GETFL);
flag = fcntl(stderr->_fileno, F_GETFL);

flag = fcntl(stdin->_fileno, F_SETFL, flag | O_APPEND);

flag = fcntl(fd, F_GETFL);
flag = fcntl(stdin->_fileno, F_GETFL);
flag = fcntl(stdout->_fileno, F_GETFL);
flag = fcntl(stderr->_fileno, F_GETFL);

close(fd);

这是我解决这个问题的代码。

最佳答案

登录过程(或终端打开过程)传统上使用的“技巧”之一是为文件描述符 0(标准输入)以读写模式打开终端,然后为文件描述符 1 和 2 复制该模式(标准输出和标准错误)。这意味着:

  1. 所有三个标准文件描述符共享相同的打开文件描述。
  2. 您可以写入标准输入并从标准输出或标准错误中读取。
  3. 更改其中一个文件的描述信息也会更改其他文件的描述信息。

fcntl() 的 F_GETFL 和 F_SETFL 选项与打开的文件描述相关。fcntl() 的 F_GETFD 和 F_SETFD 选项与文件描述符相关。

一个给定的打开文件描述可能有多个文件描述符关联,在单个进程内(在 dup()dup2() 之后)或跨进程(因为fork()).

关于c - Linux C,为什么 fcntl 作用于 STDIN 也会影响 STDOUT 和 STDERR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19485751/

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