C 在子进程中操作流

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); } 事实

我很难理解这些概念是如何工作的,如果你能帮助我,请记住我在C或OS相关方面没有太多经验

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

...
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,是的,这是真的,但我这里所说的副本是指每个进程都有自己的
文件*