Это странный вопрос. У меня есть 2 разных программы: сервер и клиент.Избегайте зомби, когда отец находится в ожидании семафора.
запуск сервера, распределение всей очереди сообщений и начало ожидания сигнала от клиента (сигнал предназначен для указания серверу, что «есть новое сообщение»). сервер остается в бесконечном цикле, пока не получит SIGQUIT. клиент, когда отливают, начинают посылать огромное количество сообщений на сервере
for(;;){//infinite loop
wait(sem,1); //wait for new message
rc = msgctl(msgid, IPC_STAT, &qbuff);
seq_num++;
pid=fork(); //new process for take the message
if(!pid){
if((msgrcv(msgid, &q, msgsz, 1,MSG_NOERROR))== -1)
perror("msgrcv error");
else{
pthread_mutex_lock(&mutex); //start critic sector
printf("\nthere is a prenotation\n");
q.price=get_conf_value(q.kindof_service)+(q.priority*get_conf_value(3)); //costo = costo_visita + (priorità * costo_priorità)
q.turn=seq_num-q.priority; //assign turn
pthread_mutex_unlock(&mutex); //end critic sector
if(q.turn<0)q.turn=0; //controllo del turno che non sia minore di 0
printf("---------------------------");
printf("\nPrenotation number %i\npid caller: %i\npriorità: %i\n for %i\ncost %i\nturn %i\n",seq_num,q.clientId,q.priority, q.kindof_service ,q.price, q.turn);
printf("---------------------------\nPrenotation ok\n\n\n");
}
printf("\nsuccess.\n");
exit(1); //close children process
}
}
Проблема заключается в том, что, таким образом, отец оставить так много зомби. Если я добавлю
else{//i am the father
waitpid(pid, 0, 0);
}
есть проблема в том, Мне нужно, чтобы вилка отца так много времени и что не дожидайтесь конца процесса перед тем, как развить вилку.
Но без waitpid проблема другая .. потому что после этого он начинает весь процесс, необходимый для получения всего сообщения, отец берет на себя управление и все еще ожидает другого сигнала от клиента (первое ожидание (sem, 1)), оставляя так много зомбического процесса.
Я не знаю, если я объяснил это хорошо .. очень трудно в английском -_-
Итак, я хочу сервер, который, получив сигнал, вилка много много раз. любой ребенок принимает сообщение и делает кое-что, потом ребенок заканчивается. Тем временем сервер продолжает ждать нового входящего сообщения. Все без зомби :)
Что вы хотите создать новый процесс для каждого получаемого вами сообщения или вы хотите, чтобы несколько процессов получали несколько сообщений одновременно? –
Мне нужен новый процесс для каждого сообщения, которое я получаю! – ReTanica
О, и я должен сказать, что я могу запускать клиент много раз, все togheter, затем одно mesasge, а затем запускать 3 клиента, отправляя 10 сообщений каждый – ReTanica