c - 暂停破壳
问题描述
我目前正在用 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);
}
解决方案
Ctrl-Z 使终端驱动程序向前台进程组发送 SIGSTOP。该信号不能被捕获或忽略。防止shell停止的唯一方法是躲避信号:一旦分叉,(父)shell 必须更改进程组,而将子进程留在原来的进程组中。
man tcsetpgrp
从和开始man setpgid
。
作为旁注,printf
不是信号安全的。不要在信号处理程序中使用它。
推荐阅读
- python - 如何在 Python 和 ROS 中应用全局变量?
- c# - 传递给 File.ReadAllBytes 方法的文件路径被预先添加执行路径覆盖
- swift - 如何在设备旋转后更新 ScrollView Width?
- node.js - 有没有办法让 TypeORM 返回列 id 作为字符串而不是数字?
- sccm - SCCM 查询 Office 2016 内部版本号不在添加/删除程序中
- c# - 无法在带有身份的 ASP.NET Core 中使用我的 MySql 数据库
- solr - 具有自定义字段类型的 Solr 动态字段无法正常工作
- flutter - 如果网络中屏幕的宽度发生变化,我该如何重建?
- sql - 在 SQL 中查找具有多个字母数字值的字段中的字母数字值
- google-bigquery - BigQuery Left Join 收入数据