我在APUE看到了这段代码片段
dup2(fd,0);
dup2(fd,1);
dup2(fd, 2);
if (fd > 2)
close(fd);
在我的理解中,它使stdin,stdout和stderr都指向fd。它说批量程序包含这个代码,为什么?它的功能是什么?
答案 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的任何语句。