fork()新进程并写入子进程和父进程的文件

时间:2014-10-11 08:14:52

标签: c process fork file-descriptor

我是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

我主要担心的是,我不太明白为什么“开始”会被写入parent.out两次。如果我完全删除for循环,则只写入一个“Begin”,这是预期的。

所以我认为这是因为fork()而且我肯定想念或者不理解它背后的一些逻辑。你能帮我解释一下吗?

我的计划是能够在parent.out中的for循环之前写一些东西,并在parent.out中的for循环期间写一些东西。子进程将写入child.out。

1 个答案:

答案 0 :(得分:4)

在C中,使用FILE结构的输入/输出操作在用户进程级别进行缓冲。在您的情况下,您写入fp_parent的输出实际上并未写入磁盘,而是在fork时刻保存在本地缓冲区中。 fork创建整个过程的副本,包括包含Begin的缓冲区,这就是它在文件中出现两次的原因。尝试将fflush(fp_parent);放在fork之前。这将刷新缓冲区,脏线将从文件中消失。

相关问题