gpt4 book ai didi

c - 暂停破坏 shell

转载 作者:行者123 更新时间:2023-11-30 14:42:14 24 4
gpt4 key购买 nike

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

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);
}

最佳答案

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

man tcsetpgrpman setpgid 开始。

顺便说一句,printf 不是信号安全的。不要在信号处理程序中使用它。

关于c - 暂停破坏 shell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54491049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com