4

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

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

据我了解,它使标准输入、标准输出和标准错误都指向 fd。它说很多程序包含此代码,为什么?它有什么功能?

4

2 回答 2

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 描述符,但它们并不是指可能干扰另一个进程的文件或设备。

于 2015-06-02T00:55:22.500 回答
0

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

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

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

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

例如 dup2(fd,1) 意味着文件描述符作品被复制到标准输出。fd 包含任何打印标准输出的语句。

于 2013-05-02T10:08:51.053 回答