走向未来

走向未来

2024 南京大学《操作系统:设计与实现》
走向未来

“包罗万象” 的操作系统课

实际:操作系统非常复杂

  • 我们完全无法在课堂里覆盖所有细节
  • 例子:开学时抛出的问题
    • 为什么 Ctrl-C 可以终止程序
    • (当然,这种事实性的问题问 GPT 就可以了)
  • 祝贺:你发现了水面下的冰山

center

2024 南京大学《操作系统:设计与实现》
走向未来

机制 (1): 终端和 Shell

center

终端:一个可读、可写 (可控制) 的 I/O 设备

  • Interactive shell 连接到终端
    • 随处都有终端设备:vscode, tmux, ttyd, ...
    • Ctrl-C 是设备 “发出” 的
2024 南京大学《操作系统:设计与实现》
走向未来

问题就来了

进程如何能感知到 Ctrl-C?

  • Ctrl-C 向进程发送信号 (SIGINT)

哪个进程会收到信号?

  • 这是个复杂的问题
    • 因为我们有 job control (可以切换 “前台” 的进程)
    • 应该只有 “面前” 的进程收到才对

提问很重要

  • 有问题,就有答案
2024 南京大学《操作系统:设计与实现》
走向未来

setpgid/getpgid(2)

Process group, session, controlling terminal

  • The PGID (process-group ID) is preserved across an execve(2) and inherited in fork(2)...
  • Each process group is a member of a session

center

2024 南京大学《操作系统:设计与实现》
走向未来

Job Control: 小结

center

2024 南京大学《操作系统:设计与实现》
走向未来

信号:回到状态机

ANSI C signal handling

#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
  • 今天有更可靠的版本 (例如支持信号嵌套): sigaction (2)

为编号为 signum 的信号设置处理程序 handler

  • SIG_IGN (ignore), SIG_DFL (default), 或是一个函数的地址
    • stty 可以查看更多的终端控制命令 (Ctrl-D, Ctrl-, ...)
2024 南京大学《操作系统:设计与实现》
走向未来

kill 系统调用

kill: 发送信号 (不是 “杀死”)

  • UNIX: 我们就这么随手一命名 😂
  • 命令行:kill -SIGNAME pid
    • 可以 SIGINT, SIGQUIT, ...
      • SIGKILL (9) 是不可忽略的信号
      • 强行终止,因此不推荐
  • 大家熟悉的 Segmentation Fault/Floating point exception (core dumped)
    • #GP, #PF 或 #DIV
    • 操作系统会给进程发送信号
2024 南京大学《操作系统:设计与实现》