子进程执行fork调用之前写入的语句

时间:2013-02-20 16:15:26

标签: c fork ipc

我正在我的代码中创建子进程。当我调用fork()时,子进程应该从下一个语句开始执行,但在我的代码中,子进程在fork调用之前执行语句。

#include<stdio.h>
int main()
{
int pid;
FILE *fp;
fp = fopen("oh.txt","w");
fprintf(fp,"i am before fork\n");
pid = fork();
        if(pid == 0)
        {
                fprintf(fp,"i am inside child block\n");
        }
        else{
                fprintf(fp,"i inside parent block\n");
        }
fprintf(fp,"i am inside the common block to both parent and child\n");
fclose(fp);
return 0;
}

这是我得到的输出

输出:

i am before fork
i inside parent block
i am inside the common block to both parent and child
i am before fork
i am inside child block
i am inside the common block to both parent and child

“我在前叉”之前的行应该在文件中写入一次,但是由孩子和父母写两次。 为什么会这样?

谢谢。

2 个答案:

答案 0 :(得分:4)

这可能是一个缓冲问题。 fprintf不会立即写入文件,而是缓冲输出。当您fork时,最终会得到两份缓冲区。

在分叉之前尝试执行fflush(fp),看看是否能解决问题。

答案 1 :(得分:2)

我想这是因为你用fprintf打印,它被缓冲但没有打印,然后在刷新缓冲区时在子进程中打印。