信号与系统呼叫使用&关系

时间:2015-09-22 05:11:47

标签: linux signals system-calls

我已经学习了一段时间的linux编程,我知道signal& system call是完全不同的概念。

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

我理解正确吗?

我的问题是:

这个概念之间是否存在深刻或简单的关系?

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

2 个答案:

答案 0 :(得分:1)

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

您可以在https://www.win.tue.nl/~aeb/linux/lk/lk-5.html

中详细了解信号

答案 1 :(得分:1)

系统调用是用户空间和内核空间之间的集合点。当需要更复杂的东西 - 从设备读取,写入设备,更改硬件配置,发送网络数据包,您为其命名时,正常的用户级代码如何陷入内核空间。

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

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

您可以为用户保留的信号设置自定义处理程序,例如 <script type="text/javascript"> function toggleFullScreen() { if ((document.fullScreenElement && document.fullScreenElement !== null) || (!document.mozFullScreen && !document.webkitIsFullScreen)) { if (document.documentElement.requestFullScreen) { document.documentElement.requestFullScreen(); } else if (document.documentElement.mozRequestFullScreen) { document.documentElement.mozRequestFullScreen(); } else if (document.documentElement.webkitRequestFullScreen) { document.documentElement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT); } } else { if (document.cancelFullScreen) { document.cancelFullScreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.webkitCancelFullScreen) { document.webkitCancelFullScreen(); } } } </script> SIGUSR1,并为此做些什么。您可以使用信号在SIGUSR2sigsuspend(2)(以及标志)的帮助下编写基本的父/子同步机制。您可以使用sigaction(2)来取消无响应的流程(尽管建议首先尝试SIGKILL让其有机会优雅地终止)。

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