2012-02-14 2 views
0

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

+0

Вы должны вызывать только _exit() в дочернем процессе. Для каждого основного вызова должно быть не более одного вызова exit(), и это должно почти всегда происходить в родительском процессе. – rasmus

+0

Так определенно используйте _exit() вместо exit() у детей? Хорошо, спасибо rasmus. –

+0

Правильно. Если вам нужна дополнительная информация, посмотрите [здесь] (http://www.unixguide.net/unix/programming/1.1.3.shtml). – rasmus

ответ

0

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

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

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