信号与系统调用的使用及关系

问题描述 投票:0回答:3

我学习linux编程有一段时间了,我知道

signal
system call
是完全不同的概念。

据我理解,

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

我理解正确吗?

我的问题是:

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

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

linux signals system-calls
3个回答
5
投票

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

基本上,用户代码通过系统调用与内核交互;调用系统调用是向内核请求服务。这样做时,会生成一个中断来“唤醒”内核。这称为“捕获”到内核空间。 另一方面,信号是一种独立且不同的通信机制。信号被内核用来异步通知用户进程各种事件(在某些情况下,I/O可用,或无效的内存访问尝试,或非法指令等),但它们也可以在进程之间使用:如果您拥有正确的权限,您可以从用户空间进程向另一个用户空间进程发送信号。

您可以为用户保留的信号(例如

SIGUSR1

SIGUSR2
)设置自定义处理程序,并用这些信号做任何您喜欢的事情。您可以在
sigsuspend(2)
sigaction(2)
(和标志)的帮助下使用信号编写基本的父/子同步机制。您可以使用
SIGKILL
终止无响应的进程(尽管建议您首先尝试
SIGTERM
给它一个优雅终止的机会)。

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


1
投票
两者

您可以在

https://www.win.tue.nl/~aeb/linux/lk/lk-5.html

阅读有关信号的更多信息


0
投票

当操作系统呼叫您时会发出信号:

通知您一些数据已到达网络或磁盘, 西吉奥。
  • 告诉你停止运行,SIGTERM 或 SIGKILL。
  • 通知您您的代码刚刚访问了内存越界,SIGSEG
  • 系统调用是当您调用操作系统时:

要求操作系统执行一些 I/O,例如屏幕输出或网络流量。 (写)
  • 询问操作系统你是谁,或者现在是什么时间。 (获取pid)
  • 当然,两者都取决于您使用的操作系统!

信号和系统调用的共同特征是 CPU 的“中断”功能,即 CPU 停止正在执行的操作并调用操作系统。

要了解更多信息,请查看这篇文章以供参考

https://www.cs.uaf.edu/2011/fall/cs301/lecture/10_24_signal_syscall.html

© www.soinside.com 2019 - 2024. All rights reserved.