C forkexec,带有非阻塞管道IO

C forkexec,带有非阻塞管道IO,第1张

概述这似乎是一件相当普遍的事情,而且我已经设法自学了我需要的一切,除了我现在有一个问题,这是我的故障排除. int nonBlockingPOpen(char *const argv[]){ int inpipe; pid_t pid; /* open both ends of pipe nonblockingly */ pid = fork(); switc 这似乎是一件相当普遍的事情,而且我已经设法自学了我需要的一切,除了我现在有一个问题,这是我的故障排除.
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;}

为什么子进程每次生成一行时都不会将其stdout写入管道?在execvp或dup2的工作方式中是否有一些我缺少的东西?我知道我对这一切的处理方式有点奇怪,但我找不到另一种以编程方式捕获闭源二进制文件输出的方法.

解决方法 我猜你只有在退出后才能获得exec’d程序的输出,因为在每条消息之后它不会是 flush.如果是这样,你无法从外面做任何事情.

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

你不能强制你正在执行的二进制程序刷新.如果您认为非阻塞I / O是该问题的解决方案,抱歉,但我担心这是非常正交的.

编辑:好吧,如果exec’d程序只使用libc提供的缓冲(没有实现它自己的)并且是动态链接的,你可以强制它通过将它与一个刷新每次写入的修改过的libc相连接来刷新.这将是一个绝望的措施.只有在其他一切都失败时才尝试.

总结

以上是内存溢出为你收集整理的C fork / exec,带有非阻塞管道IO全部内容,希望文章能够帮你解决C fork / exec,带有非阻塞管道IO所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1240251.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存