我正在为家庭作业编写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缓冲区)。
答案 0 :(得分:0)
我的理解是,在现代操作系统中,调用exit
会导致进程结束,并且将解除分配给线程池的内存。然而,这是一种清理内存使用的真正草率方式,实际上不应该指望它,因为有很多东西可以中断并杀死进程,更不用说显然存在内存不足的潜在问题。
这是OOP可以派上用场的地方,但我认为因为这是一个家庭作业,所以你不能用C写作吗?
我会编写一个新模块来实现某种类型的列表(例如链表)来管理共享内存的分配和解除分配。该模块需要一些公开的API来分配内存和释放内存。 (想想:malloc
和free
的包装函数。)它还需要一个锁定机制来强制执行单一访问,这样两个进程就不会相互停止。