Я работал над своей оболочкой (используя шум линии) и полностью выполнил почти все ее требования.Остается только обработка сигналов.
Я бы хотел, чтобы SIGINT был перенаправлен на любые запущенные дочерние процессы (если есть) и полностью игнорировался родительским процессом (т. Е. Процесс, выполняющий фактическую оболочку, никогда не завершится приCTRL + C).
Я просматривал другие посты, касающиеся проблемы, и пытался внедрить такие решения, как настройка групп процессов, но безрезультатно.
Вот что я сделал до сих пор:
void handler() {
printf("\n");
}
void acceptInput(){
pid_t shell_pid = getpid();
setpgid(0, 0);
char* line;
while((line = linenoise(">")) != NULL) {
sighandler_t *old_handler = signal(SIGINT, &handler);
parseInput(input); //later calls the appropriate commands to execute
}
linenoiseFree(input);
}
Это решение завершает работу любого дочернего элемента, работающего по сочетанию клавиш CTRL + C, как и предполагалось.Но он также прервал бы самого родителя, если не запущен дочерний процесс.Я понятия не имею, как заставить родителя игнорировать сигнал SIGINT.
Я очень озадачен этой темой и благодарен за любые разъяснения.