【问题标题】:signal & system call usage & relationship信号和系统调用的使用和关系
【发布时间】:2015-12-18 22:57:21
【问题描述】:

我学过一段时间linux编程,我知道signalsystem call是完全不同的概念。

据我了解,system call 是内核对外提供的接口,signal 是一种让进程从内核或其他进程接收信息的机制。它们对我来说是一种逆向过程。

我理解正确吗?

我的问题是:

这两个概念之间是否有更深或更简单的关系?

这似乎是一个愚蠢的问题,但有时我会将它们混合在一起,我需要仔细考虑以区分它们。我试图获得一个简单的意见来帮助我理解它们之间的关系和区别。

【问题讨论】:

  • 信号本身就是一个系统调用
  • @kkk by signal 我不是指函数,内核中大约有 31 种不同类型的 signal,对吧?

标签: linux signals system-calls


【解决方案1】:

系统调用是用户空间和内核空间之间的集合点。当需要做一些更复杂的事情时——从设备读取、写入设备、更改硬件配置、发送网络数据包等等,这就是正常的用户级代码陷入内核空间的方式。

基本上,用户代码通过系统调用与内核交互;调用系统调用是对内核的服务请求。这样做时,会产生一个“唤醒”内核的中断。这称为捕获到内核空间。

另一方面,信号是一种独立且不同的通信机制。内核使用信号来异步通知用户进程各种事件(在某些情况下,I/O 可用,或无效的内存访问尝试,或非法指令等),但它们也用于进程之间:如果你拥有正确的权限,你可以从一个用户空间进程向另一个用户空间进程发送信号。

您可以为用户保留的信号(例如SIGUSR1SIGUSR2)设置自定义处理程序,并使用这些信号做任何让您满意的事情。在sigsuspend(2)sigaction(2)(和一个标志)的帮助下,您可以使用信号来编写基本的父/子同步机制。您可以使用SIGKILL 终止无响应的进程(尽管建议您先尝试SIGTERM 让它有机会优雅地终止)。

所以,你看,可能性是无穷无尽的。系统调用是对内核的服务请求,遵循严格定义的 API,并允许您进入和离开内核模式以进行管理操作。信号更像是一种通用的进程通信机制,也恰好被内核用来通知用户进程,但还有其他用途。

【讨论】:

【解决方案2】:

用户空间程序和内核之间的公共通信通道由系统调用给出。但是有一个不同的通道,即信号通道,在用户进程之间以及从内核到用户进程使用。

你可以在https://www.win.tue.nl/~aeb/linux/lk/lk-5.html阅读更多关于信号的信息

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 2017-05-07
    • 2014-09-10
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    相关资源
    最近更新 更多