我在理解这些概念是如何工作时遇到问题,如果你能帮助我,请记住我在C或OS方面没有太多经验。
我意识到当我创建子进程文本时,数据和堆栈被复制,并且该子进程可以访问以前打开的文件描述符。我尝试从main函数
运行这样的东西...
pid = fork();
if(pid > 0) {
pid = wait(&child_status);
fprintf(fp, "smth");
}
else if (pid == 0) {
fclose(fp);
}
事实证明它实际上会打印“smth”到与fp stream相关联的文件。
问:这是否意味着当我创建子进程并且在子进程中关闭它时,程序和文件之间的连接是重复的,不会影响父进程,或者无法关闭子进程内的连接?
答案 0 :(得分:1)
在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;
}