【发布时间】:2020-05-25 06:58:23
【问题描述】:
我在CSAPP一书中做shell实验室时遇到了这个问题,实验室要求你用一些规范实现自己的shell版本,其中之一是
键入 ctrl-c (ctrl-z) 应该会导致 SIGINT (SIGTSTP) 信号 发送到当前前台作业,以及该作业的任何后代 作业(例如,它派生的任何子进程)。如果没有 前台工作,那么信号应该没有效果。
所以你应该完成一个名为 sigint_handler 的给定函数,它应该捕获 SIGINT 信号并将其发送到前台作业。下面是我在网上找到的一段代码(代码通过了正确性检查)
void sigint_handler(int sig)
{
int olderrno = errno;
pid_t pid = fgpid(jobs);
if (pid != 0)
kill(-pid, sig);
errno = olderrno;
return;
}
我不明白的是,如果 SIGINT 是使用 kill 发送的,那么前台作业的后代也会使用这个处理程序来捕获 SIGINT 信号,对吗?所以这是对我的一种递归调用。那么这实际上是如何工作的?谢谢你帮助我。
处理程序安装在主函数中
signal(SIGINT, sigint_handler); /* ctrl-c */
和 fgpid 返回当前前台作业的 PID,如果没有这样的作业,则返回 0
【问题讨论】:
-
我们没有看到所有的代码。处理程序安装在哪里?它是如何安装的?
fgpid返回什么?如果fgpid在后代作业中返回pid = 0怎么办?这不算作停止条件吗? -
我更新了问题描述