gpt4 book ai didi

c - 在子进程中操作流

转载 作者:行者123 更新时间:2023-11-30 14:49:11 25 4
gpt4 key购买 nike

我在理解这些概念如何工作时遇到问题,如果您可以帮助我,请记住我在 C 或操作系统相关内容方面没有太多经验。

我意识到,当我创建子进程时,文本、数据和堆栈都会被复制,并且该子进程可以访问之前打开的文件描述符。我尝试从主函数运行类似的东西

...
pid = fork();
if(pid > 0) {
pid = wait(&child_status);
fprintf(fp, "smth");
}
else if (pid == 0) {
fclose(fp);
}

事实证明,它实际上确实将“smth”打印到与 fp 流关联的文件中。

问:这是否意味着当我创建子进程并在子进程中关闭它时,程序和文件之间的连接会重复,不会影响父进程,或者无法关闭子进程内的连接?

最佳答案

fork 后,每个进程都会有自己的文件副本,因此在一个进程中关闭文件并不意味着该文件将在另一个进程中关闭。

关于您的代码,您仅在子进程(而不是父进程)中关闭了文件。因此,为了保存您的更改,您也必须在父进程中关闭它。另外,不要忘记处理 fork 错误情况:

pid = fork();
if(pid > 0) {
pid = wait();
fprintf(fp, "smth");
fclose(fp);
} else if (pid == 0) {
fclose(fp);
} else {
perror("Fork error");
return 1;
}

如果您希望从子进程执行fprintf,则必须更改if条件,如下所示:

pid = fork();
if(pid == 0) {
/* Child */
pid = wait();
fprintf(fp, "smth");
fclose(fp);
} else if (pid > 0) {
/* Parent */
fclose(fp);
} else {
perror("Fork error");
return 1;
}

关于c - 在子进程中操作流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49826110/

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