为什么放置 \n 会改变执行顺序
why putting \n alters the order of execution
当我尝试在 c 中编写僵尸进程模拟代码时,由于在 printf 语句中放入 \n,我的输出发生了变化:
代码 1:
main()
{
int id;
id=fork();
if(id>0)
{
printf("Parent will sleep");//pf1//
sleep(5);
//system("ps -u");
}
if(id==0)
printf("I am child");//pf2//
}
输出:
I am childParent will sleep
但是当将 \n 放入 pf1 或 pf2 时,语句的执行顺序 changes.what 是 \n 改变顺序的原因?
stdout
是 行缓冲。
当您 printf
将某些内容输出到标准输出时,库会缓冲此内容,直到观察到换行符为止。届时,缓冲区将被刷新,并最终显示在您的控制台上。如果不打印换行符,数据可能会无限期地留在缓冲区中,直到下次打印换行符或进程退出时才会看到。
要确保您的打印件始终立即可见,您可以执行以下操作之一:
fprintf(stderr, ...)
代替。 stderr
没有缓冲;写入其中的数据将立即可见。
fflush(stdout)
- 手动强制立即刷新流。
更新: 请注意,none 这实际上很重要,因为涉及到固有的竞争条件。你无法控制是父进程还是子进程先执行,哪个数据先写入控制台。您甚至可能会看到交错的输出,因为它们都试图同时打印。 (感谢jschultz410指出我的愚昧)
当我尝试在 c 中编写僵尸进程模拟代码时,由于在 printf 语句中放入 \n,我的输出发生了变化:
代码 1:
main()
{
int id;
id=fork();
if(id>0)
{
printf("Parent will sleep");//pf1//
sleep(5);
//system("ps -u");
}
if(id==0)
printf("I am child");//pf2//
}
输出:
I am childParent will sleep
但是当将 \n 放入 pf1 或 pf2 时,语句的执行顺序 changes.what 是 \n 改变顺序的原因?
stdout
是 行缓冲。
当您 printf
将某些内容输出到标准输出时,库会缓冲此内容,直到观察到换行符为止。届时,缓冲区将被刷新,并最终显示在您的控制台上。如果不打印换行符,数据可能会无限期地留在缓冲区中,直到下次打印换行符或进程退出时才会看到。
要确保您的打印件始终立即可见,您可以执行以下操作之一:
fprintf(stderr, ...)
代替。stderr
没有缓冲;写入其中的数据将立即可见。fflush(stdout)
- 手动强制立即刷新流。
更新: 请注意,none 这实际上很重要,因为涉及到固有的竞争条件。你无法控制是父进程还是子进程先执行,哪个数据先写入控制台。您甚至可能会看到交错的输出,因为它们都试图同时打印。 (感谢jschultz410指出我的愚昧)