我目前正在用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);
}
答案 0 :(得分:1)
Ctrl-Z使终端驱动程序将SIGSTOP发送到前台进程组。该信号不能被捕获或忽略。防止您的 shell 被停止的唯一方法是闪避信号:分叉后,(父)shell必须更改进程组,同时将子进程保留在原始进程中。
以man tcsetpgrp
和man setpgid
开头。
请注意,printf
并不安全。不要在信号处理程序中使用它。