分叉的孩子

时间:2015-04-25 22:55:25

标签: c fork shared-memory signal-handling

我想知道是否有必要(或建议)在通过munmap创建的子节点中取消映射共享内存(使用fork),如果内存是在父节点中获取的,在fork之前,使用mmap(..., MAP_ANONYMOUS | MAP_SHARED,...)并且也将在父级中取消映射,这将为子级wait。 另外我想知道是否有必要(或建议)关闭子文件中的文件,如果文件在父文件中打开(在fork之前,使用fopen)并且将在父文件后关闭孩子终止了。

我正在考虑使用用户定义的信号和信号处理程序,其中父级将等待子进程,然后该进程 - 无论是否是父级 - 将关闭文件并取消映射内存。此信号将从发生错误的进程发送到组中的所有进程(我不想传递返回值)。

实际上它有点复杂,但我只想知道我是否需要这样做:

void sig_handler() {
    if (getpid() == getpgrp()) // parent
        while (proc_count--)
            wait(NULL); // signal has already been sent to all child processes
    // every single process will do this:
    fclose(memory->file);
    munmap(memory, size);
    exit(123);
}

完全可以执行此操作:

void sig_handler() {
    if (getpid() == getpgrp()) {
        while (proc_count--)
            wait(NULL);
        fclose(memory->file);
        munmap(memory, size);
    }
    exit(123);
}

我试过在一个子进程中关闭文件;它似乎对其他进程没有影响 - 我假设fd表是在fork上复制的。有没有办法让它在进程之间共享? (可能不是,我怀疑)

任何答案都表示赞赏。谢谢。

PS。有没有理由不能用问候语(例如你好)开始我的问题?

1 个答案:

答案 0 :(得分:0)

如果你要退出这个过程,那么调用munmap()是没有意义的。当进程退出时,将为该进程取消映射内存。

fclose()会将保存未写入数据的缓冲区刷新到文件中。在所有过程中 - 父母和孩子。你是否想要那件事取决于你。

exit()隐式刷新所有缓冲区。 _exit()不会刷新缓冲区或调用任何其他退出处理程序。