暂停破壳

时间:2019-02-02 07:36:09

标签: c shell signals

我目前正在用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);
}

1 个答案:

答案 0 :(得分:1)

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

man tcsetpgrpman setpgid开头。

请注意,printf并不安全。不要在信号处理程序中使用它。