c - fork 子中的 munmap 匿名共享内存

标签 c fork shared-memory signal-handling

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

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

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

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 上复制的。有没有办法让它在进程之间共享? (我怀疑可能不是)

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

附言。为什么我不能以问候语(例如,你好)开始我的问题?

最佳答案

如果您要退出进程,则调用 munmap() 没有意义。当进程退出时,该进程的内存将被取消映射。

fclose() 会将所有包含未写入数据的缓冲区刷新到文件中。在所有过程中 - parent 和 child 。您是否想要这取决于您。

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

关于c - fork 子中的 munmap 匿名共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29871645/

相关文章:

c - qt connect() 的文档页面

c - 在管道中传递来自进程的整数数组

c - 在试图终止父进程时,子进程仍在运行

即使在关闭其输入后,子进程也会挂起

使用 POSIX 标准将结构复制到 C 中的共享内存

可以从共享内存创建 Tensorflow 变量吗?

operating-system - 不分离共享内存段会产生什么影响

c - 有没有办法在 Linux 中创建虚拟文件描述符?

java - Java 中的元数据如何帮助防止段错误?

php - OpenLDAP ldap_get_option() 响应