linux 信号和系统呼叫使用和关系

8ftvxx2r  于 4个月前  发布在  Linux
关注(0)|答案(3)|浏览(62)

我学过一段时间的Linux编程,我知道signalsystem call是完全不同的概念。
据我所知,system call是内核提供给外部的接口,signal是一种机制,让进程接收来自内核或其他进程的信息。
我理解得对吗?

我的问题是:

这两个概念之间是否有更深或更简单的关系?
这似乎是一个愚蠢的问题,但有时我把它们混在一起,我需要仔细思考,以区分它们。我试图得到一个简单的意见,以帮助我理解它们之间的关系和区别。

lb3vh1jj

lb3vh1jj1#

系统调用是用户空间和内核空间之间的会合点。当需要做一些更复杂的事情时--从设备阅读、向设备写入、更改硬件配置、发送网络数据包,等等,正常的用户级代码就是这样陷入内核空间的。
所以基本上,用户代码通过系统调用与内核交互;调用系统调用是向内核请求一个服务。在这样做的时候,会产生一个中断来“唤醒”内核。这被称为“捕获”到内核空间。
另一方面,信号是一种独立的、不同的通信机制。信号被内核用来异步地通知用户进程各种事件(在某些情况下,I/O可用,或无效的内存访问尝试,或非法指令等),但它们也用于进程之间:如果你有正确的权限,你可以从一个用户空间进程发送一个信号到另一个用户空间进程。
您可以为用户保留的信号(如SIGUSR1SIGUSR2)设置一个自定义处理程序,并使用这些处理程序执行您喜欢的任何操作。您可以使用SIGKILL杀死一个无响应的进程(尽管建议您先尝试SIGTERM,以便给予一个优雅终止的机会)。
所以,你看,可能性是无限的。系统调用是对内核的服务请求,遵循严格定义的API,并允许您进入和离开内核模式进行管理操作。信号更像是一种通用的进程通信机制,也恰好被内核用来通知用户进程,但还有其他用途。

rkkpypqq

rkkpypqq2#

用户空间程序和内核之间的通信通道是由系统调用提供的,但还有一个不同的通道,即信号通道,既用于用户进程之间,也用于内核到用户进程之间。
你可以在https://www.win.tue.nl/~aeb/linux/lk/lk-5.html中阅读更多关于信号的信息

smdncfj3

smdncfj33#

信号和系统调用是完全相反的,信号是内核空间调用用户空间的一种机制,而在系统调用中,用户空间向内核请求它所需要的一些服务。
一个信号是当操作系统调用你:

  • 为了通知您,一些数据到达网络或从磁盘,SIGIO。
  • 告诉你停止跑步,SIGTERM或SIGKILL。
  • 为了通知您代码刚刚访问了越界内存,SIGSEG

一个系统调用是当你调用操作系统:

  • 要求操作系统执行某些I/O,如屏幕输出或网络流量。
  • 询问操作系统您是谁,或者现在是什么时间。(getpid)

当然,这两者都取决于您使用的操作系统!
信号和系统调用的共同特性是CPU的“中断”特性,即CPU停止它正在做的事情并调用操作系统。
要了解更多信息,请参阅本文https://www.cs.uaf.edu/2011/fall/cs301/lecture/10_24_signal_syscall.html

相关问题