C fork程序解释
C fork program explanation
我有如下代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
printf("a\n");
fork();
printf("b\n");
if(fork() == 0) {
printf("c\n");
exit(0);
}
printf("d\n");
return 0;
}
输出:
a
b
d
a
b
c
a
b
d
a
b
c
我不知道为什么输出重复了很多次。
I don't know why the output duplicated many times
因为printf()
被缓冲了。
当进程调用 fork()
时,生成的子进程获得父进程输出缓冲区的副本。
您可以通过在每次调用 fork()
之前放置 fflush(stdout)
来清空此输出缓冲区。在那种情况下输出应该是:
a
b
b
d
c
d
c
请注意,如果输出引用终端,默认情况下它将是 行缓冲,即:每次 \n
时都会转储缓冲区发送到输出。如果您将输出重定向到文件,则不是这样。
当您调用 fork()
时,它会获取调用进程的输出缓冲区的副本。默认情况下启用缓冲,因此您会得到这种行为。
您可以使用
fflush(stdout);
在调用 fork() 之前。或者,您也可以使用
禁用缓冲
setbuf(stdout, NULL);
您可以阅读有关 fork 的更多信息 here。如果您需要更多帮助,请告诉我。
答案已经在评论里了。您正在呼叫 fork()
两次。所以解决方案是只调用一次并将结果保存在像这样的变量中int pid = fork()
。此外,您应该检查 fork-call 是否失败(如果失败,则 returns 为负值)。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
printf("a\n");
int pid = fork();
if (pid < 0)
{
fprintf(stderr, "Can't fork!");
exit(1);
}
printf("b\n");
if(pid == 0)
{
printf("c\n");
}
else
{
printf("d\n");
}
return 0;
}
我有如下代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
printf("a\n");
fork();
printf("b\n");
if(fork() == 0) {
printf("c\n");
exit(0);
}
printf("d\n");
return 0;
}
输出:
a
b
d
a
b
c
a
b
d
a
b
c
我不知道为什么输出重复了很多次。
I don't know why the output duplicated many times
因为printf()
被缓冲了。
当进程调用 fork()
时,生成的子进程获得父进程输出缓冲区的副本。
您可以通过在每次调用 fork()
之前放置 fflush(stdout)
来清空此输出缓冲区。在那种情况下输出应该是:
a
b
b
d
c
d
c
请注意,如果输出引用终端,默认情况下它将是 行缓冲,即:每次 \n
时都会转储缓冲区发送到输出。如果您将输出重定向到文件,则不是这样。
当您调用 fork()
时,它会获取调用进程的输出缓冲区的副本。默认情况下启用缓冲,因此您会得到这种行为。
您可以使用
fflush(stdout);
在调用 fork() 之前。或者,您也可以使用
禁用缓冲setbuf(stdout, NULL);
您可以阅读有关 fork 的更多信息 here。如果您需要更多帮助,请告诉我。
答案已经在评论里了。您正在呼叫 fork()
两次。所以解决方案是只调用一次并将结果保存在像这样的变量中int pid = fork()
。此外,您应该检查 fork-call 是否失败(如果失败,则 returns 为负值)。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
printf("a\n");
int pid = fork();
if (pid < 0)
{
fprintf(stderr, "Can't fork!");
exit(1);
}
printf("b\n");
if(pid == 0)
{
printf("c\n");
}
else
{
printf("d\n");
}
return 0;
}