Команды канала дважды вызывают функцию сигнала - PullRequest
1 голос
/ 08 мая 2020

Я пытаюсь создать базовую c оболочку, которая поддерживает трубопровод. Поэтому я написал следующий код:

int file_descriptor[2];
if (pipe(file_descriptor) == -1) {
    perror("error: pipe failed");
    return;
}

int command_pid1 = fork();
if (command_pid1 < 0) {
    perror("error: fork failed");
    return;
}

if (command_pid1 > 0) {
    // Parent process
    if (waitpid(command_pid1, NULL, 0) < 0) {
        perror("error: waitpid failed");
    }

    int command_pid2 = fork();
    if (command_pid2 < 0) {
        perror("error: fork failed");
        return;
    }

    if (command_pid2 > 0) {
        // Parent process
        close(file_descriptor[0]);
        close(file_descriptor[1]);
        waitpid(command_pid2 , NULL, 0);
        return;
    }

    if (command_pid2 == 0) {
        // Child process
        dup2(file_descriptor[0],STDIN_FILENO);
        close(file_descriptor[0]);
        close(file_descriptor[1]);
        instance.execute(second_command);
        exit(0);
    }
}

if (command_pid1 == 0) {
    // Child process
    if (pipe_err) {
        dup2(file_descriptor[1], STDERR_FILENO);
    } else {
        dup2(file_descriptor[1], STDOUT_FILENO);
    }

    close(file_descriptor[0]);
    close(file_descriptor[1]);
    instance.execute(first_command);
    exit(0);
}

Я хочу поддерживать ввод, например, sleep 1 | sleep 10, где sleep 1 - это first_command, а sleep 2 - это second_command. Я также хочу поддерживать сигналы. Мой код работает нормально, пока я не попытаюсь нажать Ctrl+C во время работы канала. Способ, которым я установил обработчик:

signal(SIGINT, ctrlCHandler);

В ctrlCHandler я печатаю, что пользователь щелкнул Ctrl+C.

Итак, когда я использую Ctrl+C во время выполнения sleep 1 | sleep 10, он печатает Pressed Ctrl+C дважды и должен печатать только один раз. Кажется, я не могу найти способ исправить это, поэтому он будет печататься только один раз. Как мне обрабатывать сигналы?

...