为什么要将stdin,stdout和stderr改为单个fd?

时间:2013-05-02 08:55:52

标签: c unix io

我在APUE看到了这段代码片段

dup2(fd,0); dup2(fd,1); dup2(fd, 2); if (fd > 2) close(fd);

在我的理解中,它使stdin,stdout和stderr都指向fd。它说批量程序包含这个代码,为什么?它的功能是什么?

2 个答案:

答案 0 :(得分:2)

我会在这里添加评论和答案,因为即使他们正确无误,我仍然很难理解何时以及为何需要这一系列电话。

当进程作为守护进程运行时,通常使用此函数调用序列。在这种情况下,守护进程并不希望将标准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' to each of the standard I/O descriptors and closes the temporary descriptor used to open / dev / null`(只要该打开并没有使用通常用于标准I / O描述符的描述符之一某种原因)。

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

答案 1 :(得分:0)

这主要用于守护进程程序,因为守护进程未与终端或tty连接。所以我们需要在一个文件中维护错误或打印的语句。因为只有我们使用这个陈述。在我们的系统中,文件描述符0,1,2已经分配给标准缓冲区,如stdin等...

Dup2功能与dup功能不同。 在dup2函数中,我们不需要使用文件描述符关闭。

在这个dup2函数本身中,如果第二个参数文件描述符已经在使用平均值 没有close()函数dup2关闭第二个参数fd并分配一个第一个参数fd。

然后第一个参数fd连接到第二个fd并执行第一个fd工作

例如dup2(fd,1)表示文件描述符的工作原理被复制到stdout。 fd包含打印stdout的任何语句。