在dup2之后,我可以假设stdio流指向正确的文件描述符吗?

时间:2014-04-03 12:34:28

标签: c fork pipe stdio sus

我有代码,我想将一段特定的代码封装到一个分叉的子代中,这样如果代码导致问题,它就不会影响父代,父代就能报告。

exec来电后我不是fork。只需简单fork,然后运行通常在父代运行的代码。

子代码将代码输出到stdoutstderr。由于交错输出和stdio缓冲问题,我现在正在调查TLPI以获得更好的解决方案。

我提出的想法大致是:

    每个流
  • pipe()
  • fork()
  • 小孩子里面的:
    • close()读取管道末尾
    • dup2()写入分别结束stdoutstderr的文件描述符
    • setbuf(fd, NULL)关闭孩子内部的stdio流缓冲。
    父母中的
    • close()写管道末尾
    • 使用select / pselect / epoll等(必须在Linux,BSD,AIX,Solaris等上运行)来监视新数据管道的读取端以及何时将write()直接传递给父进程中的相应文件描述符。

现在,我认为孩子内部的dup2setbuf之间缺少一步。它是什么?

setbuf需要FILE*,而dup2当然会int

想到了{p> freopen,但它需要一条路径。如果我只是想为流分配一个新的fileno,我该怎么做?

1 个答案:

答案 0 :(得分:1)

extern个变量stdinstdoutstderrFILE *个指针。您可以将这些内容传递给setbuf / setvbuf。但是,请注意,子项具有单独的地址空间,因此在fork()时它将继承缓冲区的状态,两者都可以安全地继续使用缓冲区,如果您fflush { {1}}和STDOUT,输出缓冲区无论如何都是空的。

这是我在孩子身上做的方式(未经测试,请添加一些错误处理):

STDERR