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

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

DUP2(FD,0);
 DUP2(FD,1);
 dup2(fd,2);
 if(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’绑定到每个标准I / O描述符,并首先关闭用于打开/ dev / null`的临时描述符(只要该打开没有结束使用其中一个由于某种原因通常用于标准I / O描述符的描述符).

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

点赞