Ссылки и очистка памяти, используемой процессами Forked - PullRequest
0 голосов
/ 15 февраля 2012

Я пишу 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 () очищает (кроме очистки буферов ввода / вывода).

1 Ответ

0 голосов
/ 15 февраля 2012

Насколько я понимаю, в современных операционных системах вызов exit приводит к завершению процесса и выделению памяти для пула потоков.Тем не менее, это очень неаккуратный способ очистить использование памяти, и на него не следует рассчитывать, потому что есть много вещей, которые могут прервать и убить процесс, не говоря уже об очевидной потенциальной проблеме нехватки памяти.

Здесь ООП может пригодиться, но я предполагаю, что, так как это домашнее задание, вы застряли, написав его на C?

Я бы написал новый модуль, который реализует списокнекоторый тип (например, связанный список) для управления распределением и удалением общей памяти.Для модуля потребуются некоторые открытые API для выделения памяти и освобождения памяти.(Подумайте: функции-обертки для malloc и free.) Также потребуется механизм блокировки для обеспечения единственного доступа, чтобы два процесса не останавливались друг на друге.

...