有一个程序可以进行各种系统调用,其中一些进行 IO,另一些则不进行;让我们举几个例子:
- 获取时间
- fork
- 写
- 阅读
- 控制
当进程在执行系统调用时被杀死(SIGKILL)时,操作系统内核(Linux 2+/FreeBSD7+/OSX)会发生什么?特别是:当进程即将终止时,每个系统调用是否都知道如何清理自身?
最佳答案
What happens in operating system kernel (Linux 2+/FreeBSD7+/OSX) when a process is being killed (SIGKILL) while it is executing a system call?
进程在内核模式的上下文中执行系统调用。此时如果内核接收到任何中断(信号来自软件中断),它将检查该特定中断的优先级。软件中断在所有类型的中断中具有最低的优先级,因此它将继续执行直到完成关键路径执行。此时内核将存储其上下文并确定中断的原因和优先级并为中断提供服务(在这种情况下是终止/终止程序)。
然而,这些概念有点复杂,并且可能因系统而异。您可能需要引用莫里斯·J·巴赫 (Maurice J Bach) 的名著《UNIX 操作系统的设计》,其中详细描述了这些概念和实现。
In particular: does every single system call know how to clean-up itself when process termination is imminent?
是的,因为系统调用代表进程在内核模式的上下文中执行。 所以当进程开始中止/终止时,他们总是有清理的逻辑。如果用户模式程序由于意外原因终止,内核确保它清理该特定进程的所有资源。这是内核的伟大之处。
关于linux - 当一个进程被杀死(*nix)时,系统调用的调用会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22742201/