我正在编写用于作业分配的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来分配内存和释放内存。 (认为:malloc
和free
的包装器函数。)它还需要一种锁定机制来强制执行单数访问,以便两个进程不会彼此停止。
关于c - 引用和清理 fork 进程共享的内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9283968/