【发布时间】:2011-03-20 14:18:25
【问题描述】:
这似乎是一件相当普遍的事情,而且我已经成功地自学了使它工作所需的一切,除了我现在有一个问题,它无法解决我的故障排除。
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 的工作方式有什么我遗漏的吗?我知道我处理这一切的方法有点奇怪,但我找不到另一种方法来以编程方式捕获闭源二进制文件的输出。
【问题讨论】:
-
我刚刚找到homepage.ntlworld.com/jonathan.deboynepollard/FGA/…这个页面,这表明我不应该尝试向子进程传递非阻塞描述符,但没有列出其中的原因似乎适用于我正在做的事情。我确实意识到,如果监听进程与管道断开连接(在子进程中生成 EAGAIN),我正在运行的程序可能会崩溃,但这并不困扰我。
标签: c pipe fork stdout nonblocking