我现在正在与福克斯合作,并且在尝试打印过程中时,我遇到了一个奇怪的行为。"。"每秒和第二个打印5" *"每隔几秒钟。
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char const *argv[]) {
int pid = fork();
//parent
if (pid > 0){
for(int i = 0; i < 5; i++){
printf("\n*\n");
sleep(2);
}
}
//child
else{
for(int i = 0; i < 10; i++){
printf("\n.\n");
sleep(1);
}
}
return 0;
}
使用此代码,我得到以下输出:
*
*
*
*
*
这是我的预期,但如果我从printf函数中删除\ n,就像这样
printf("*");
然后我得到了这个输出:
***** ..........
有没有解释为什么输出的顺序不同?
答案 0 :(得分:0)
写入同一STDOUT的多个进程只会在刷新时将数据推送到文件描述符。新线刷新,进程退出。因此,当打印换行符时,每行都会在打印时刷新。但如果没有,每个的输出都会被缓冲,直到它退出,然后一次全部写入。
答案 1 :(得分:0)
输出可以在实际写出之前缓存一段时间。输出流中的\n
通常会触发当前输出流以进行刷新。没有\n
,看起来输出在程序退出之前没有刷新,然后一切都被写出来了。