我从 APUE 看到了这段代码片段
dup2(fd,0);
dup2(fd,1);
dup2(fd, 2);
if (fd > 2)
close(fd);
据我了解,它使标准输入、标准输出和标准错误都指向 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 描述符,但它们并不是指可能干扰另一个进程的文件或设备。
这主要用于守护程序,因为守护程序没有与终端或 tty 连接。因此,我们需要在一个文件中维护错误或打印的语句。为此,我们只使用了这个语句。在我们的系统中,文件描述符 0,1,2 已经分配给标准缓冲区,如标准输入等...
Dup2 函数与 dup 函数不同。在 dup2 函数中,我们不需要关闭已经使用文件描述符。
在这个 dup2 函数本身中,如果第二个参数文件描述符已经在使用没有 close() 函数的方法,则 dup2 将关闭第二个参数 fd 并分配第一个参数 fd 的 dup。
然后第一个参数 fd 连接到第二个 fd 并执行第一个 fd 工作
例如 dup2(fd,1) 意味着文件描述符作品被复制到标准输出。fd 包含任何打印标准输出的语句。