我想知道是否有必要(或建议)在通过 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/