首页 > 解决方案 > 暂停破壳

问题描述

我目前正在用 C 编写一个程序,它将(在有限的程度上)模仿命令提示符或终端。到目前为止,它可以运行命令,知道如何识别内部命令,并且还理解 CTRL + C 停止正在运行的进程而不杀死外壳,但我似乎无法开始工作的是 CTRL + Z (这将暂停一个使用 SIGTSTP 的进程如下所示)(其中 taskPID 是分叉后的当前进程 ID)。如果我在正在运行的进程上调用 CTRL + C,它将显示消息,并返回到 shell 提示符(这是 main 中的一个 while 循环),如果我调用 CTRL + Z,它会挂起并显示一个无限闪烁的光标,我失去对壳牌的控制。任何想法都会受到赞赏,因为我坚持这个。

void
sigint_handler (int sig)
{
    printf("Process[%d] was Terminated Suddenly by User via (CTRL + C)\n",taskPID);
    kill(-taskPID, SIGINT);
}
void
sigtstp_handler (int sig)
{
  printf("Process[%d] was Suspended by User via (CTRL + Z)\n",taskPID);
  kill(-taskPID, SIGTSTP);
}

标签: cshellsignals

解决方案


Ctrl-Z 使终端驱动程序向前台进程组发送 SIGSTOP。该信号不能被捕获或忽略。防止shell停止的唯一方法是躲避信号:一旦分叉,(父)shell 必须更改进程组,而将子进程留在原来的进程组中。

man tcsetpgrp从和开始man setpgid

作为旁注,printf不是信号安全的。不要在信号处理程序中使用它。


推荐阅读