我有代码,我想将一段特定的代码封装到一个分叉的子代中,这样如果代码导致问题,它就不会影响父代,父代就能报告。
exec
来电后我不是fork
。只需简单fork
,然后运行通常在父代运行的代码。
子代码将代码输出到stdout
和stderr
。由于交错输出和stdio
缓冲问题,我现在正在调查TLPI以获得更好的解决方案。
我提出的想法大致是:
pipe()
fork()
close()
读取管道末尾dup2()
写入分别结束stdout
和stderr
的文件描述符setbuf(fd, NULL)
关闭孩子内部的stdio
流缓冲。close()
写管道末尾select
/ pselect
/ epoll
等(必须在Linux,BSD,AIX,Solaris等上运行)来监视新数据管道的读取端以及何时将write()
直接传递给父进程中的相应文件描述符。现在,我认为孩子内部的dup2
和setbuf
之间缺少一步。它是什么?
setbuf
需要FILE*
,而dup2
当然会int
。
freopen
,但它需要一条路径。如果我只是想为流分配一个新的fileno,我该怎么做?
答案 0 :(得分:1)
extern
个变量stdin
,stdout
和stderr
是FILE *
个指针。您可以将这些内容传递给setbuf
/ setvbuf
。但是,请注意,子项具有单独的地址空间,因此在fork()
时它将继承缓冲区的状态,两者都可以安全地继续使用缓冲区,如果您fflush
{ {1}}和STDOUT
,输出缓冲区无论如何都是空的。
这是我在孩子身上做的方式(未经测试,请添加一些错误处理):
STDERR