В моей программе каждый раз, когда пользователь вводит сообщение через stdin, код читает его и вызывает fork () для создания нового (дочернего) процесса. Этот дочерний процесс отправляет данные (пользователь вводит сообщение), используя сокет сервера.
Чтобы завершить процесс клиента, я бы хотел, чтобы пользователь набрал «quit». В этот момент я бы хотел, чтобы мой код вышел из цикла While (1), дождался завершения обработки всех дочерних процессов (так что не осталось ни одного потерянного / зомби-процесса). И затем, когда все дочерние процессы завершатся и завершатся, я бы хотел, чтобы программа завершилась.
Однако теперь и с моим кодом, как показано ниже, когда пользователь нажимает «quit», хотя дочерние процессы завершаются успешно, цикл начинается заново. Кто-нибудь знает, что я делаю не так в коде?
int status = 0;
while (1) {
// Read request from standard input
printf("Enter a message: ");
memset(out_buffer, 0, BUFFER_SIZE);
fgets(out_buffer, BUFFER_SIZE - 1, stdin);
out_buffer[strcspn(out_buffer, "\r\n")] = 0;
// Spawn new process to handle new client
if ((pid = fork()) == -1) {
printf("[-]Error spawning child process for new client.\n");
continue;
}
// Child process
else if (pid == 0) {
// ...
if (input_status == -2) {
printf("[-]Disconnected from server.\n");
close(socket_fd);
termination_call = 1;
exit(0);
}
}
if (termination_call == 1) {
printf("[-]Client terminating...\n");
break;
}
}
// Wait for all child processes to exit
while ((wpid = wait(&status)) > 0);
return 0;