Я пытаюсь форк и 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);
все работает как положено. Я хочу неблокирующий ввод-вывод, хотя ...
Спасибо за чтение моего поста.