我是fork()函数、父子进程的新手,对我编写的代码背后的逻辑有些困惑,并未实现我的期望。以下是我写的代码:
int main (int argc, char** argv)
{
FILE *fp_parent;
FILE *fp_child;
fp_parent = fopen ("parent.out","w");
fp_child = fopen ("child.out","w");
int test_pid;
printf ("GET HERE\n");
fprintf (fp_parent,"Begin\n"); // MY CONCERN
for (int i = 0; i < 1; i++) //for simplicity, just fork 1 process.
{ // but i want to fork more processes later
test_pid = fork();
if(test_pid < 0)
{
printf ("ERROR fork\n");
exit (0);
}
else if(test_pid == 0) // CHILD
{
fprintf(fp_child,"child\n");
break;
}
else //PARENT
{
fprintf(fp_parent,"parent\n");
}
}
fclose(fp_parent);
fclose(fp_child);
}
因此,上述代码的输出结果为:
to stdout: GET HERE
in parent.out:
Begin
parent
Begin
in child.out:
child
我的主要问题是我不太明白为什么“Begin”会被写入parent.out两次。如果我完全删除for循环,那么只会写入一个“Begin”,这是预期的。
所以我认为这是由于fork()引起的,肯定是我错过了或不理解其中的一些逻辑。你们能帮我解释一下吗?
我的计划是在for循环之前在parent.out中写入一些内容,并在for循环期间在parent.out中写入一些内容。子进程将写入child.out。
FILE
进行的I/O在标准库中进行缓冲,该库与您的代码链接并生成可执行程序。这意味着它发生在与您自己的代码通过自己的代码进行缓冲时相同的级别上。缓冲区在程序地址空间中由您的程序物理分配,这就是它们被fork
复制的原因。如果您不想使用这些缓冲区,请使用没有f
的I/O函数,即open
,write
,close
。 - Marian