我想知道是否有必要(或建议)在通过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。有没有理由不能用问候语(例如你好)开始我的问题?
答案 0 :(得分:0)
如果你要退出这个过程,那么调用munmap()
是没有意义的。当进程退出时,将为该进程取消映射内存。
fclose()
会将保存未写入数据的缓冲区刷新到文件中。在所有过程中 - 父母和孩子。你是否想要那件事取决于你。
exit()
隐式刷新所有缓冲区。 _exit()
不会刷新缓冲区或调用任何其他退出处理程序。