【问题标题】:What happens to the invocation of system call when a process is killed (*nix)?当一个进程被杀死(*nix)时,系统调用的调用会发生什么?
【发布时间】:2014-05-09 15:33:53
【问题描述】:

有一个程序可以进行各种系统调用,有的做 IO,有的不做;让我们举几个例子:

  • gettimeofday
  • 分叉
  • 阅读
  • ioctl

当一个进程在执行系统调用时被杀死 (SIGKILL) 时,操作系统内核 (Linux 2+/FreeBSD7+/OSX) 会发生什么?特别是:当进程即将终止时,是否每个系统调用都知道如何自行清理?

【问题讨论】:

    标签: linux unix process kernel system-calls


    【解决方案1】:

    当操作系统内核 (Linux 2+/FreeBSD7+/OSX) 发生什么情况时 进程在执行系统时被杀死(SIGKILL) 打电话?

    进程在内核模式的上下文中执行系统调用。此时,如果内核收到任何中断(信号来自软件中断),它将检查该特定中断的优先级。软件中断在所有类型的中断中优先级最低,因此它会继续执行,直到完成关键路径执行。此时内核将存储其上下文并确定中断的原因和优先级并为中断服务(在这种情况下是终止/终止程序)。

    但是这些概念有点复杂,并且可能在不同的系统上有所不同。您可能想参考 Maurice J Bach 的伟大著作《UNIX 操作系统的设计》,其中详细描述了这些概念和实现。

    特别是:是否每个系统调用都知道如何清理 当进程即将终止时自身?

    是的,因为系统调用代表进程在内核模式的上下文中执行。 因此,当进程开始中止/终止时,他们总是有清理的逻辑。如果用户模式程序由于意外原因终止,内核确保它清理该特定进程的所有资源。这就是内核的伟大之处。

    【讨论】:

    • 如果内核正在为一个进程提供一个 ioctl 并且该进程得到一个 SIGSEV 或 SIGKILL 信号。那么进程是否只有在内核完成ioclt并将值返回给进程后才会被杀死?
    猜你喜欢
    • 2018-10-01
    • 2013-01-16
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2017-01-23
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多