我在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描述符,但它们并不是指可能干扰其他进程的文件或设备.