我从 APUE 看到了这个代码片段
dup2(fd,0);
dup2(fd,1);
dup2(fd, 2);
if (fd > 2)
close(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' to each of the standard I/O descriptors and closes the temporary descriptor used to open
/dev/null` 首先(只要该打开最终没有使用通常用于标准 I/O 描述符的描述符之一)。
现在,守护进程具有有效的 stdin/stdout/stderr 描述符,但它们并不引用可能干扰另一个进程的文件或设备。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)