gpt4 book ai didi

具有非阻塞管道 IO 的 C fork/exec

转载 作者:太空狗 更新时间:2023-10-29 17:10:54 28 4
gpt4 key购买 nike

这似乎是一件相当常见的事情,我已经设法自学了让它工作所需的一切,除了我现在有一个问题,它无法解决我的问题。

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 的工作方式有什么我遗漏的吗?我知道我处理这一切的方法有点奇怪,但我找不到另一种方法来以编程方式捕获闭源二进制文件的输出。

最佳答案

我猜你只会在 exec 程序退出后得到它的输出,因为它不会 flush在每条消息之后。如果是这样,您从外部无能为力。

我不太确定这与您问题中阻塞和非阻塞 I/O 之间的选择有何关系。非阻塞写入可能会完全或部分失败:调用会立即返回并表示它无法写入它应该拥有的所有内容,而不是阻塞程序直到管道中有可用空间。非阻塞 I/O 既不会增大缓冲区也不会强制刷新输出,而且某些程序可能不支持它。

您不能强制刷新正在执行的纯二进制程序。如果您认为非阻塞 I/O 是该问题的解决方案,对不起,但恐怕它是完全正交的。

编辑:好吧,如果 exec 程序只使用 libc 提供的缓冲(不实现它自己的缓冲)并且是动态链接的,您可以通过将它链接到每次写入都会刷新的修改后的 libc 来强制刷新。这将是一个孤注一掷的措施。只有在其他一切都失败时才尝试。

关于具有非阻塞管道 IO 的 C fork/exec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3326725/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com