【问题标题】:Manipulating streams in child process在子进程中操作流
【发布时间】:2018-04-13 22:50:11
【问题描述】:

我在理解这些概念的工作原理时遇到问题,如果您能帮助我,请记住,我在 C 或 OS 相关方面没有太多经验。

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

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

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

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

【问题讨论】:

    标签: c process stream fork


    【解决方案1】:

    forking 之后,每个进程都会有自己的文件副本,所以在一个进程中关闭文件,并不意味着该文件会在另一个进程中关闭。

    关于您的代码,您仅在子进程(而不是父进程)中关闭了文件。因此,为了保存您的更改,您也必须在父进程中关闭它。另外,不要忘记处理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;
    }
    

    【讨论】:

    • 谢谢,您在第一部分回答了我的问题。至于从子进程执行 fprintf,我想我已经知道 fork 如何返回,但是您的示例让我想知道从子进程内部调用时 wait() 会做什么?我猜没什么?编辑:英语不好
    • @bo2032, wait(2) 等待孩子的状态变化。所以从没有孩子的孩子那里调用这个函数,“什么都不做”。
    • 每个进程在文件描述符表中都有一个指向打开文件的条目。不是文件本身的副本。
    • @TonyTannous,是的,没错,但我在这里的意思是,每个进程都有自己的FILE *
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多