如何解决C叉-令人困惑的输出
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
fork();
printf("Hello");
fork();
return 0;
}
此处代码不使用'\ n'即可打印Hello
输出: HelloHelloHelloHello
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
fork();
printf("Hello\n");
fork();
return 0;
}
这里的代码用\ n打印Hello 输出:
Hello
Hello
解决方法
@Stolenmoments的怀疑是正确的。
基本上,前一个printf
语句用一些数据填充了stdin
缓冲区,第二个fork复制了stdin
缓冲区。当所有程序退出时,它们都会刷新缓冲区。
要查看Granchild叉子是否未打印,我们可以像这样扩展您的程序:
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
int childpid = fork();
printf("%s %d,","Hello",childpid);
childpid = fork();
return 0;
}
然后我们得到输出Hello 11221,Hello 0,Hello 11221,
显然,第二个fork的childpid
是不同的,否则它们将不会被派生。
但是只要我们添加fflush
#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
fork();
printf("Hello");
fflush(stdout);
fork();
return 0;
}
我们得到预期的输出HelloHello
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。