ch10,信號1

preview
需积分: 0 0 下载量 123 浏览量 更新于2022-08-03 收藏 11.95MB PDF 举报
在Linux操作系统中,信号(Signals)是进程间通信的一种机制,用于向进程发送通知或中断其执行。在本文中,我们将深入探讨信号的概念、处理方式以及相关函数。 信号是一种异步事件通知,通常用来指示进程发生了某种情况,如程序错误、用户交互或系统事件。例如,在命令行中按下`Ctrl+C`会发送一个`SIGINT`信号给当前前台进程,告诉它用户想要中断执行。 在Linux中,`^C`(即`Ctrl+C`)通常用于发送`SIGINT`信号给进程,这会导致默认的处理行为——终止进程。当你在终端连续输入`^C`时,可以看到进程被中断的响应,如示例所示的bash shell提示符的变化。 为了处理信号,Linux提供了`signal()`函数,它定义在`<signal.h>`头文件中。`signal()`函数允许程序员注册信号处理函数。例如,可以定义一个名为`sighandler_t`的函数指针类型,用于处理信号。`signal()`函数接受两个参数:一个是信号编号(如`SIGINT`),另一个是处理函数。如果设置为`SIG_IGN`,则忽略该信号;如果设置为`SIG_DFL`,则使用默认处理方式(通常是终止进程)。 然而,`signal()`函数在某些情况下可能不安全,因为它存在竞态条件的问题。为了解决这些问题,Linux引入了`sigaction()`函数,它提供了更高级的信号控制。`sigaction()`允许设置更多的选项,如信号掩码、信号递归行为等,并且避免了`signal()`函数的竞态问题。 `kill()`函数是发送信号给进程或进程组的主要接口,它也定义在`<signal.h>`头文件中。`kill()`函数接受两个参数:一个是进程ID(pid),另一个是信号编号。当pid为0时,信号被发送给发送者所在的进程组;当pid为负数时,信号被发送给pid对应的进程组;当pid为正数时,信号被发送给指定的进程。 关于权限,只有超级用户(root)可以向任何进程发送信号,而普通用户只能向与自己具有相同实际或有效用户ID的进程发送信号。 在示例代码`list_sig.c`中,程序创建了一个信号处理函数`sighandler()`,它会在接收到信号时打印信号编号和名称。然后,程序遍历0到99的所有信号,尝试为每个信号注册`sighandler()`。如果注册成功,`sig_exist`数组会被标记为1,表示该信号可以被处理。程序会列出所有可以处理的信号及其名称。 总结一下,本节主要介绍了Linux中的信号机制,包括信号的发送、接收、处理函数的注册以及相关的`signal()`、`sigaction()`和`kill()`函数。这些概念和函数是理解和编程控制Linux进程行为的基础。
药罐子也有未来
  • 粉丝: 29
  • 资源: 300
上传资源 快速赚钱
voice
center-task 前往需求广场,查看用户热搜

最新资源