gpt4 book ai didi

c - Fork() 新进程并写入子进程和父进程的文件

转载 作者:行者123 更新时间:2023-12-04 09:38:40 24 4
gpt4 key购买 nike

我是 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 循环,则只会写入一个预期的“开始”。

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

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

最佳答案

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

关于c - Fork() 新进程并写入子进程和父进程的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26312556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com