请看一下这个示例代码,它使用一个非常完善的编程模式来重定向stdout
到管道。
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd[2];
pipe(fd);
pid_t pid = fork();
if (pid == 0) {
close(fd[0]);
dup2(fd[1], 1);
printf("A string");
_exit(0);
}
close(fd[1]);
char text[1000];
size_t size;
int p = 0;
while ((size = read(fd[0], text+p, 1)) == 1) {
p++;
}
close(fd[0]);
text[p] = '\0';
printf("%s", text);
return 0;
}
该代码实际上无法正常工作。正如 @kaylum 的评论中正确建议的那样,调用exit
代替_exit
在子进程中使代码正常工作。
exit()
刷新所有打开的流作为其终止的一部分,而_exit()
不刷新 - 因此调用时任何缓冲的输出都会丢失_exit()
.
你可以让它“工作”:
1)通过调用fflush(stdout);
刷新缓冲输出before打电话给_exit()
or
2)禁用标准输出的缓冲:setbuf(stdout, 0);
在 main() 的开头。
POSIX 要求流刷新exit():
exit() 函数随后应使用未写入的内容刷新所有打开的流
缓冲数据并关闭所有打开的流。最后,该过程应
被终止 [CX],其后果与中所述相同
进程终止的后果。
同样,要求流是not冲过_exit():
_Exit() [CX] 和 _exit() 函数不得调用函数
使用 atexit() 或任何已注册的信号处理程序注册。 [CX]
开放的流不应被冲洗。打开的流是否关闭
(不刷新)是实现定义的。最后,调用
进程应终止,并产生下述后果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)