Почему нельзя вырваться из цикла while, в котором разветвляются многие дочерние потоки? - PullRequest
0 голосов
/ 26 августа 2018

В моей программе каждый раз, когда пользователь вводит сообщение через 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;

1 Ответ

0 голосов
/ 26 августа 2018

Вам нужно проверить команду "quit" в родительском .

Когда вы создаете новый процесс, он запускается независимо от родительского процесса, и данные между ними не передаются.

Если вы хотите поделиться данными, рассмотрите потоки.

...