C 在子进程中操作流
我很难理解这些概念是如何工作的,如果你能帮助我,请记住我在C或OS相关方面没有太多经验 我意识到,当我创建一个子进程文本时,数据和堆栈被复制,并且该子进程可以访问以前打开的文件描述符。我试着从main函数运行类似的东西C 在子进程中操作流,c,process,stream,fork,C,Process,Stream,Fork,我很难理解这些概念是如何工作的,如果你能帮助我,请记住我在C或OS相关方面没有太多经验 我意识到,当我创建一个子进程文本时,数据和堆栈被复制,并且该子进程可以访问以前打开的文件描述符。我试着从main函数运行类似的东西 ... pid = fork(); if(pid > 0) { pid = wait(&child_status); fprintf(fp, "smth"); } else if (pid == 0) { fclose(fp); } 事实
...
pid = fork();
if(pid > 0) {
pid = wait(&child_status);
fprintf(fp, "smth");
}
else if (pid == 0) {
fclose(fp);
}
事实证明,它确实会将“smth”打印到与fp流关联的文件中
问:这是否意味着当我创建子进程时,程序和文件之间的连接是重复的,并且在子进程中关闭它不会影响父进程,或者不可能在子进程中关闭连接?在
分叉之后,每个进程都将有自己的文件副本,因此在一个进程中关闭文件,并不意味着该文件将在其他进程中关闭
关于代码,您只在子进程(而不是父进程)中关闭了文件。因此,为了保存更改,您也必须在父进程中关闭它。另外,不要忘记处理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;
}
谢谢你,你用回答的第一部分回答了我的问题。至于从child执行fprintf,我想我已经知道fork是如何返回的,但您的示例让我想知道,当从child进程内部调用wait()时,wait()会做什么?我想没什么?编辑:坏english@bo2032,wait(2)
等待子级中的状态更改。因此,从没有子进程的子进程调用此函数时,“什么也不做”。每个进程在文件描述符表中都有一个指向打开文件的条目。不是文件本身的副本。@TonyTannous,是的,这是真的,但我这里所说的副本是指每个进程都有自己的文件*
。