Это, по-видимому, довольно распространенная вещь, и мне удалось научить себя всему, что мне нужно, чтобы заставить ее работать, за исключением того, что у меня теперь есть одна проблема, что бросает вызов моим устранению неполадок.C fork/exec с неблокирующей трубой IO
int nonBlockingPOpen(char *const argv[]){
int inpipe;
pid_t pid;
/* open both ends of pipe nonblockingly */
pid = fork();
switch(pid){
case 0: /*child*/
sleep(1); /*child should open after parent has open for reading*/
/*redirect stdout to opened pipe*/
int outpipe = open("./fifo", O_WRONLY);
/*SHOULD BLOCK UNTIL MAIN PROCESS OPENS FOR WRITING*/
dup2(outpipe, 1);
fcntl(1, F_SETFL, fcntl(1, F_GETFL) | O_NONBLOCK);
printf("HELLO WORLD I AM A CHILD PROCESS\n");
/*This seems to be written to the pipe immediately, blocking or not.*/
execvp(*argv, argv);
/*All output from this program, which outputs "one" sleeps for 1 second
*outputs "two" sleeps for a second, etc, is captured only after the
*exec'd program exits!
*/
break;
default: /*parent*/
inpipe = open("./fifo", O_RDONLY | O_NONBLOCK);
sleep(2);
/*no need to do anything special here*/
break;
}
return inpipe;
}
Почему бы дочерний процесс не записывал свою станду в трубу каждый раз, когда генерируется линия? Есть ли что-то, что мне не хватает в том, как работают execvp или dup2? Я знаю, что мой подход ко всему этому немного странный, но я не могу найти другой способ программно отображать выходные данные двоичных файлов с закрытым исходным кодом.
Я только что нашел http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/dont-set-shared-file-descriptors-to-non-blocking-mode.html эту страницу, которая указывает что я не должен пытаться передать дочернему процессу неблокирующий дескриптор, но ни одна из причин, перечисленных здесь *, не кажется * применимой к тому, что я делаю. Я действительно понимаю, что программа, которую я запускаю, вероятно, потерпит крах, если процесс прослушивания должен был отключиться от канала (генерируя EAGAIN в дочернем элементе), но это меня не беспокоит. – conartist6