![]() |
1
3
TL;DR执行摘要: 我们如何知道用fread()检索的内容是完整的? 我们有EOF。
当子进程关闭其管道末端时,将获得EOF。当它调用
如果你打电话
这里绝对没有鸡毛蒜皮的地方。 |
![]() |
2
0
|
![]() |
3
0
在进一步研究这个问题的过程中,我学到了一些东西,我想这可以回答我的问题:
回去仔细考虑什么
感谢
C - pipe without using popen
,我更明白什么
接下来,我回去更仔细地思考
所以,最后我们得到的是:
如果有人能证实我的推论和结论,我将不胜感激。 |
![]() |
4
0
popen()只是fork、dup2、execv、fdopen等系列的一个快捷方式,它可以让我们通过文件流操作轻松访问子STDOUT、STDIN。 在popen()之后,父进程和子进程都独立执行。 pclose()不是“kill”函数,它只是等待子进程终止。因为它是一个阻塞函数,所以在pclose()执行期间生成的输出数据可能会丢失。 为了避免数据丢失,我们将只在知道子进程已经终止时调用pclose():fgets()调用将返回NULL或fread()从阻塞返回,共享流到达末尾,EOF()将返回true。
注意,返回流上的所有文件操作都在阻塞模式下工作,流是打开的,没有非阻塞标志。当子进程挂起或终止时,fread()会被永远阻止,因此只能对受信任的程序使用popen()。 为了对子进程进行更多的控制,避免文件阻塞操作,我们应该自己使用fork/vfork/execlv等,用O\u NONBLOCK标志修改管道打开的attribute,不时使用poll()或select()确定是否有数据,然后使用read()函数从管道中读取。 定期对WNOHANG使用waitpid(),以查看子进程是否已终止。 |
![]() |
Leustad · Popen可以找到现有工具 7 年前 |
![]() |
Deepansh Jagga · popen()对所有命令都成功 7 年前 |
![]() |
feedMe · 从Python调用的grep搜索字符串中的斜杠 7 年前 |
![]() |
rbaleksandar · 无法使用POpen将参数传递给子进程 7 年前 |