Я пишу 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() очищает (кроме сброса буферов ввода-вывода).
Вы должны вызывать только _exit() в дочернем процессе. Для каждого основного вызова должно быть не более одного вызова exit(), и это должно почти всегда происходить в родительском процессе. – rasmus
Так определенно используйте _exit() вместо exit() у детей? Хорошо, спасибо rasmus. –
Правильно. Если вам нужна дополнительная информация, посмотрите [здесь] (http://www.unixguide.net/unix/programming/1.1.3.shtml). – rasmus