我正在使用c在linux操作系统中进行过程控制。
fork()函数真让我迷惑。
我所知道的:当fork()
被称为时
1)将fork()
之后的代码复制到子进程中。
2)我们无法确定哪个(父或子)将首先运行。
我运行以下代码。
int main() {
printf("Hi");
fork();
return 0;
}
我的第一个问题是:为什么我嗨两次? 它在Working of fork() in linux gcc中有解释,但我仍然希望有人能够更简单地解释。
我的第二个疑问: 当我将输出重定向到somefile.txt时 即使我使用换行符(\ n),输出也是:
喜
喜
请解释......
如果我错过了,请在了解fork()
答案 0 :(得分:1)
为什么我两次嗨?
如果你写:
#include <stdio.h>
int main()
{
printf("Hi");
for (;;)
;
return 0;
}
"Hi"
将不会打印在stdout
上,因为默认情况下标准输出流是行缓冲的。这意味着您必须添加'\n'
来刷新此缓冲区。
#include <stdio.h>
int main()
{
printf("Hi\n");
for (;;)
;
return 0;
}
使用fork
,父进程'缓冲区将被复制到子进程中。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
printf("Hi");
/* stdout in the father process contains "Hi" */
fork();
/* stdout in the father process contains "Hi" */
/* stdout in the child process contains "Hi" */
/* With return statement all buffers are flushed and "Hi" is printed twice */
return 0;
}
答案 1 :(得分:0)
有缓冲区:
完整缓冲区
行缓冲
没有缓冲区
在终端中使用printf
时,默认为line buffer
。因此,您可以使用\n
来刷新缓冲区。刷新缓冲区后,只打印一个hi
使用printf
重定向到文件时。默认为full buffer
。因此,您无法使用\n
来刷新缓冲区。如果没有刷新缓冲区,则打印两个hi
您可以使用setvbuf`来更改缓冲区类型。