Я пытаюсь создать базовую 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
дважды и должен печатать только один раз. Кажется, я не могу найти способ исправить это, поэтому он будет печататься только один раз. Как мне обрабатывать сигналы?