gpt4 book ai didi

c - 引用和清理 fork 进程共享的内存

转载 作者:行者123 更新时间:2023-11-30 18:02:14 25 4
gpt4 key购买 nike

我正在为家庭作业编写一个 HTTP 服务器,并且我正在尝试确保正确使用共享内存。以下是相关内容的摘要:

struct my_struct{
int num_kids;
...
}

int main(arg stuff){
...
struct mystruct *shared_data;
// shmget & shmat here
shared_data = (struct mystruct *) shared_memory;
...
while(mainloop){
...
if(incoming_connection)
if(!fork())
childstuff(shared_data);
}
...
while(shared_data->num_kids > 0)
sleep(1);
// shmdt & shmctl here
}

void childstuff(struct mystruct *shared){
shared->num_kids++;
...
shared->num_kids--;
exit(0);
}

问题

1)childstuff()能够正确访问共享内存吗?

2)我需要在子进程中调用 shmdt() 吗?

3) 在子进程中调用 exit() 而不是 _exit() 会扰乱共享内存吗?我知道 exit() 在调用 _exit() 之前清理了一些 _exit() 没有清理的东西,但我不确定 exit() 清理了哪些额外的东西(除了刷新 I/O 缓冲区)。

最佳答案

我的理解是,在现代操作系统中,调用 exit 会导致进程结束,分配给线程池的内存将被取消分配。然而,这是一种非常草率的清理内存使用的方法,实际上不应该指望,因为有很多事情可以中断和终止进程,更不用说内存不足的明显潜在问题了。

这就是 OOP 真正派上用场的地方,但我认为由于这是一项家庭作业,您只能用 C 来编写它?

我会编写一个新模块,它实现某种类型的列表(例如链接列表)来管理共享内存的分配和取消分配。该模块需要一些公开的 API 来分配内存和释放内存。 (想想:mallocfree 的包装函数。)它还需要一个锁定机制来强制执行单一访问,以便两个进程不会相互停止。

关于c - 引用和清理 fork 进程共享的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9283968/

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