我正在编写用于作业分配的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/

10-16 23:55