参考&清理分叉进程共享的内存

时间:2012-02-14 20:48:52

标签: c fork shared-memory

我正在为家庭作业编写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缓冲区)。

1 个答案:

答案 0 :(得分:0)

我的理解是,在现代操作系统中,调用exit会导致进程结束,并且将解除分配给线程池的内存。然而,这是一种清理内存使用的真正草率方式,实际上不应该指望它,因为有很多东西可以中断并杀死进程,更不用说显然存在内存不足的潜在问题。

这是OOP可以派上用场的地方,但我认为因为这是一个家庭作业,所以你不能用C写作吗?

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