2013-05-02 81 views
3

我看到这个代码片段从APUE为什么要将stdin,stdout和stderr转换为单个fd?

dup2(fd,0); dup2(fd,1); dup2(fd, 2); if (fd > 2) close(fd);

在我的理解,它使标准输入,输出和错误都指向金融衍生工具。它说很多程序都包含这些代码,为什么?它有什么功能?

+0

这可以在守护进程中使用。 – 2013-05-02 09:07:46

+0

我知道守护进程在后台运行,但它如何使用这段代码? – Sili 2013-05-02 09:10:18

+1

您可以查看[this](http://codingfreak.blogspot.com/2012/03/daemon-izing-process-in-linux.html) – 2013-05-02 09:35:45

回答

0

这主要用于守护程序,因为守护程序没有连接到终端或tty。所以为此我们需要在一个文件中维护错误或打印语句。因为只有我们在使用这种说法。在我们的系统中,文件描述符0,1,2已经分配给stdin等标准缓冲区了......

Dup2函数与dup函数有所不同。 在dup2函数中,我们不需要使用文件描述符来关闭。

在这个dup2函数本身中,如果第二个参数文件描述符已经在使用没有close()函数的手段 dup2关闭了第二个参数fd并且分配了第一个参数fd的dup。

然后第一个参数fd被连接到第二fd和要做的第一FD工作

例如DUP2(FD,1)是指文件描述符作品被复制到标准输出。 fd是包含任何打印stdout的语句。

1

我打算在这里添加评论和回答,因为即使他们是正确的,我仍然很难理解何时以及为什么需要调用这个序列。

当一个进程作为一个守护进程运行时,通常使用这个函数调用序列。在这种情况下,守护程序不希望将标准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描述符的描述符)。

现在守护进程具有有效的标准输入/标准输出/标准错误描述符,但它们并不是指可能会干扰其他进程的文件或设备。

相关问题