我从 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/