【发布时间】:2020-04-13 12:22:16
【问题描述】:
我正在创建一个 shell 程序,例如,我希望 Ctrl+C 杀死前台进程而不是后台进程; &sleep 50 是一个后台进程,我希望它是这样的,如果我要使用 Ctrl+C 它会杀死任何前台进程,并且不影响后台.但是对于我的生活无法弄清楚该怎么做,非常感谢任何帮助:D
int main(void) {
Command cmd;
int n, forSignals;
char **cmds;
char **pipedCmds;
signal(SIGINT, INThandler);
while (!done) {
char *line;
line = readline("> ");
if (!line) {
done = 1;
} else {
stripwhite(line);
if(*line) {
add_history(line);
n = parse(line, &cmd);
PrintCommand(n, &cmd);
cmds = getCmds(cmd.pgm);
pipedCmds = getPipedCmds(cmd.pgm);
executionDecider(line, cmds, pipedCmds, cmd);
}
}
if(line) {
free(line);
}
}
return 0;
}
void INThandler(int sig)
{
signal(sig, SIG_IGN);
kill(SIGINT, 0);
printf("\n");
}
附:当然还有实际执行程序的其余代码,让我知道是否有必要显示,但我相信,这是一个很好的最小可重现示例。
编辑:非常重要,不知道我是怎么忘记的:/但我需要它不要通过这样做来创建僵尸进程,它不应该留下任何僵尸。
编辑:请找到链接到整个项目的代码转储的 URL。那里可能更有意义: https://codedump.io/share/d8hrj40JdEqL/1/lshc---c-shell-program
【问题讨论】:
-
我可能遗漏了一些东西,但我认为我们需要在这里看到更多。 UNIX tty 已经 将 Ctrl-C 转换为针对前台进程组的 SIGINT。除了manage job control process groups,你不需要做任何事情。
-
你能添加
Command和其他缺少的功能吗?
标签: c shell signals signal-processing