信号&系统调用使用&关系
signal & system call usage & relationship
我学习linux编程有一段时间了,我知道signal
和system call
是完全不同的概念。
据我理解,system call
是内核对外提供的接口,signal
是一种让进程从内核或其他进程接收信息的机制。他们对我很好。
我理解正确吗?
我的问题是:
这两个概念之间有更深或更简单的关系吗?
这似乎是一个愚蠢的问题,但有时我会把它们混在一起,我需要仔细考虑以区分它们。我试图得到一个简单的意见,以帮助我理解它们之间的关系和区别。
用户 space 程序和内核之间的公共通信通道由系统调用提供。但是有一个不同的通道,即信号通道,在用户进程之间以及从内核到用户进程之间使用两者。
中阅读有关信号的更多信息
系统调用是用户 space 和内核 space 之间的会合点。当需要做一些更复杂的事情时,这就是正常的用户级代码陷入内核 space 的方式 - 从设备读取、写入设备、更改硬件配置、发送网络数据包,应有尽有。
基本上,用户代码通过系统调用与内核交互;调用系统调用是向内核请求服务。这样做时,会生成 "wakes up" 内核的中断。这称为 trapping into kernel space.
另一方面,信号是一种独立且不同的通信机制。内核使用信号异步通知用户进程各种事件(在某些情况下,I/O可用,或无效的内存访问尝试,或非法指令等),但它们也用于进程之间:如果您拥有正确的权限,您可以将信号从用户-space 进程发送到另一个用户-space 进程。
您可以为用户保留的信号(例如 SIGUSR1
和 SIGUSR2
设置自定义处理程序,并随心所欲地处理这些信号。您可以使用信号在 sigsuspend(2)
和 sigaction(2)
(以及一个标志)的帮助下编写基本的 parent/child 同步机制。您可以使用 SIGKILL
终止无响应的进程(尽管建议您首先尝试 SIGTERM
给它一个优雅终止的机会)。
所以,你看,可能性是无限的。系统调用是对内核的服务请求,遵守严格定义的 API,并允许您进入和离开内核模式以进行管理操作。信号更像是一种通用的进程通信机制,也恰好被内核用来通知用户进程,但还有其他用途。
我学习linux编程有一段时间了,我知道signal
和system call
是完全不同的概念。
据我理解,system call
是内核对外提供的接口,signal
是一种让进程从内核或其他进程接收信息的机制。他们对我很好。
我理解正确吗?
我的问题是:
这两个概念之间有更深或更简单的关系吗?
这似乎是一个愚蠢的问题,但有时我会把它们混在一起,我需要仔细考虑以区分它们。我试图得到一个简单的意见,以帮助我理解它们之间的关系和区别。
用户 space 程序和内核之间的公共通信通道由系统调用提供。但是有一个不同的通道,即信号通道,在用户进程之间以及从内核到用户进程之间使用两者。
中阅读有关信号的更多信息系统调用是用户 space 和内核 space 之间的会合点。当需要做一些更复杂的事情时,这就是正常的用户级代码陷入内核 space 的方式 - 从设备读取、写入设备、更改硬件配置、发送网络数据包,应有尽有。
基本上,用户代码通过系统调用与内核交互;调用系统调用是向内核请求服务。这样做时,会生成 "wakes up" 内核的中断。这称为 trapping into kernel space.
另一方面,信号是一种独立且不同的通信机制。内核使用信号异步通知用户进程各种事件(在某些情况下,I/O可用,或无效的内存访问尝试,或非法指令等),但它们也用于进程之间:如果您拥有正确的权限,您可以将信号从用户-space 进程发送到另一个用户-space 进程。
您可以为用户保留的信号(例如 SIGUSR1
和 SIGUSR2
设置自定义处理程序,并随心所欲地处理这些信号。您可以使用信号在 sigsuspend(2)
和 sigaction(2)
(以及一个标志)的帮助下编写基本的 parent/child 同步机制。您可以使用 SIGKILL
终止无响应的进程(尽管建议您首先尝试 SIGTERM
给它一个优雅终止的机会)。
所以,你看,可能性是无限的。系统调用是对内核的服务请求,遵守严格定义的 API,并允许您进入和离开内核模式以进行管理操作。信号更像是一种通用的进程通信机制,也恰好被内核用来通知用户进程,但还有其他用途。