【发布时间】:2011-12-08 09:30:42
【问题描述】:
我大致创建了以下代码来调用子进程:
// pipe meanings
const int READ = 0;
const int WRITE = 1;
int fd[2];
// Create pipes
if (pipe(fd))
{
throw ...
}
p_pid = fork();
if (p_pid == 0) // in the child
{
close(fd[READ]);
if (dup2(fd[WRITE], fileno(stdout)) == -1)
{
throw ...
}
close(fd[WRITE]);
// Call exec
execv(argv[0], const_cast<char*const*>(&argv[0]));
_exit(-1);
}
else if (p_pid < 0) // fork has failed
{
throw
}
else // in th parent
{
close(fd[WRITE]);
p_stdout = new std::ifstream(fd[READ]));
}
现在,如果子进程没有向标准输出写入太多内容,我可以等待它完成,然后从p_stdout 读取标准输出。如果它写入太多,则写入阻塞并且父级永远等待它。
为了解决这个问题,我尝试在父级中使用 WNOHANG 等待,如果尚未完成,请使用 readsome 从 p_stdout 读取所有可用输出,稍等片刻,然后重试。不幸的是,readsome 从来没有读过任何东西:
while (true)
{
if (waitid(P_PID, p_pid, &info, WEXITED | WNOHANG) != 0)
throw ...;
else if (info.si_pid != 0) // waiting has succeeded
break;
char tmp[1024];
size_t sizeRead;
sizeRead = p_stdout->readsome(tmp, 1024);
if (sizeRead > 0)
s_stdout.write(tmp, sizeRead);
sleep(1);
}
问题是:为什么这不起作用,我该如何解决?
编辑:如果只有孩子,简单地使用read 而不是readsome 可能会起作用,但是该进程有多个孩子并且需要在其中一个终止时立即做出反应。
【问题讨论】:
标签: c++ fork parent-child pipe