首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么要将stdin、stdout和stderr设置为一个fd?

为什么要将stdin、stdout和stderr设置为一个fd?
EN

Stack Overflow用户
提问于 2013-05-02 16:55:52
回答 2查看 566关注 0票数 4

我看到了来自APUE的代码片段

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

在我的理解中,它使得stdin、stdout和stderr都指向fd。它说lots程序包含这段代码,为什么?它的功能是什么?

EN

回答 2

Stack Overflow用户

发布于 2015-06-02 08:55:23

我将在这里添加注释和答案,因为即使它们是正确的,我仍然很难确切地理解何时以及为什么需要这个调用序列。

当进程将作为守护进程运行时,通常使用此函数调用序列。在这种情况下,守护进程不希望将标准I/O文件描述符附加到终端(或其他资源)。要“分离”这些描述符,可能会发生如下情况:

代码语言:javascript
运行
复制
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` (只要由于某种原因,open没有使用通常用于标准I/O描述符的描述符)。

现在守护进程有了有效的stdin/stdout/stderr描述符,但它们并没有引用可能会干扰另一个进程的文件或设备。

票数 2
EN

Stack Overflow用户

发布于 2013-05-02 18:08:51

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

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

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

然后将第一个参数fd连接到第二个fd,并执行第一个fd工作

例如,dup2(fd,1)表示将文件描述符works复制到标准输出。fd是包含任何语句的打印标准输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16333980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档