我一直在研究外壳(使用线路噪声),并完全实现了其几乎所有要求。剩下的就是信号处理。
我希望将SIGINT转发给任何正在运行的子进程(如果有),并被父进程完全忽略(即,运行实际shell的进程永远不会在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信号。
我对此主题感到非常困惑,并感谢您的澄清。