gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:49:46 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com