c - 为什么要将 stdin、stdout 和 stderr 设为一个 fd?

标签 c unix io

我从 APUE 看到了这个代码片段

dup2(fd,0); dup2(fd,1); dup2(fd, 2); 如果 (fd > 2) 关闭(fd);

在我的理解中,它使stdin、stdout 和stderr 都指向fd。它说很多程序都包含这段代码,为什么?它有什么功能?

最佳答案

我将在此处添加评论和回答,因为即使它们是正确的,我仍然很难准确理解何时以及为什么需要这一系列调用。

当进程将作为守护进程运行时,通常会使用此函数调用序列。在那种情况下,除其他事项外,守护程序不希望将标准 I/O 文件描述符附加到终端(或其他资源)。要“分离”这些描述符,可能会发生如下情况:

int fd;  

fd = open("/dev/null",O_RDWR);  // missing from APUE exercise 3.4 example

if (fd != -1)   
{     
  dup2 (fd, 0);  // stdin  
  dup2 (fd, 1);  // stdout
  dup2 (fd, 2);  // stderr

  if (fd > 2) close (fd);  
}  

这样做是将 /dev/null' 绑定(bind)到每个标准 I/O 描述符,并首先关闭用于打开 /dev/null` 的临时描述符(只要由于某种原因,打开并没有最终使用通常用于标准 I/O 描述符的描述符之一。

现在守护进程有有效的 stdin/stdout/stderr 描述符,但它们不是指可能干扰另一个进程的文件或设备。

关于c - 为什么要将 stdin、stdout 和 stderr 设为一个 fd?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16333980/

相关文章:

c - 在读取未知行长度的文件时确定 EOF

用 C 语言进行 Cgi 编程,从我的 cgi 程序中调用 system()。

python - 在 SWIG 中为包含 union 的结构创建类型映射 (Python)

c - 解释 STRACE 输出 - 管道和 fork

linux - 典型 Linux 发行版中最旧的代码

linux - 匹配不同文件中的 2 个字段

haskell - 从 Haskell 中的 IO 数据初始化元组

c - 试图在 C 中跳过 1 次 do/while 循环

linux - 回滚 <num> 不工作 screen

Haskell IO 与 Websockets