我正在尝试fork和exec,父进程处理stdout / stderr上的任何内容。 不幸的是,父进程没有得到任何输出。也就是说,对read的调用总是返回一个非正整数。
这是代码。怎么了?
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <iostream>
#include <string>
int main()
{
int out[2],err[2],in[2];
pipe(out);
pipe(err);
pipe(in);
int fork;
if(!(fork=::fork()))
{
dup2(in[0],STDIN_FILENO);
dup2(out[1],STDOUT_FILENO);
dup2(err[1],STDERR_FILENO);
execlp("/bin/ls","/bin/ls","-la","/");
}
fcntl(out[0], F_SETFL, fcntl(out[0], F_GETFL) | O_NONBLOCK);
fcntl(err[0], F_SETFL, fcntl(err[0], F_GETFL) | O_NONBLOCK);
for(;;)
{
int result;
waitpid(fork,&result,WNOHANG);
char ac[256];
int cnt;
while((cnt=read(out[0], ac, 256))>0)
{
std::cout << std::string(ac,ac+cnt) << std::flush;
}
while((cnt=read(err[0], ac, 256))>0)
{
std::cout << std::string(ac,ac+cnt) << std::flush;
}
if(WIFEXITED(result))
{
return 0;
}
}
}
删除这两行时:
fcntl(out[0], F_SETFL, fcntl(out[0], F_GETFL) | O_NONBLOCK);
fcntl(err[0], F_SETFL, fcntl(err[0], F_GETFL) | O_NONBLOCK);
一切都按预期工作。我想要非阻塞IO,但是......
感谢您阅读我的帖子。
答案 0 :(得分:-1)
您的代码几乎不会执行任何错误验证。
我会检查errno的返回值,当你从read读取-1时,可能会出现问题。