我已经学习了一段时间的linux编程,我知道signal
& system call
是完全不同的概念。
据我了解,system call
是内核提供给外部的接口,signal
是让进程从内核或其他进程接收信息的机制。对我来说,这是一个反向过程。
我理解正确吗?
这个概念之间是否存在深刻或简单的关系?
这似乎是一个愚蠢的问题,但有时我会把它们混合起来,我需要仔细思考以区分它们。我想得到一个简单的意见,以帮助我理解关系&他们之间的区别。
答案 0 :(得分:1)
用户空间程序和内核之间的公共通信通道由系统调用给出。但是有一个不同的信道,信号的信道,在用户进程和内核之间使用 。
中详细了解信号答案 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
,并为此做些什么。您可以使用信号在SIGUSR2
和sigsuspend(2)
(以及标志)的帮助下编写基本的父/子同步机制。您可以使用sigaction(2)
来取消无响应的流程(尽管建议首先尝试SIGKILL
让其有机会优雅地终止)。
所以,你看,可能性是无穷无尽的。 Syscalls是对内核的服务请求,遵循严格定义的API,允许您进入和退出内核模式以进行管理操作。信号更像是一种通用的进程通信机制,它也恰好被内核用来通知用户进程,但还有其他用途。