- 浏览: 140302 次
文章分类
最新评论
下表列出了每种信号的默认处理动作(有些实现支持更多信号),以及支持此信号的系统。其中,SUS 列中的“*”表示此种信号定义为基本 POSIX.1 规范部分,“XSI”表示该信号定义为 XSI 扩展部分。而系统默认动作列中的“终止+core”表示在进程当前工作目录的 core 文件中复制了该进程的内存映像(大多数 UNIX 系统调试程序都使用 core 文件检查进程终止时的状态)。
这里需要了解的是,在不同的实现中,core 文件的名字可能不同。例如,在 FreeBSD 8.0 中,core 文件名是 cmdname.core,其中 cmdname 是接收到信号的进程所执行的命令名;在 Mac OS 10.6.8 中,core 文件名是 core.pid,其中 pid 是接收到信号的进程的 ID。这些系统允许经 sysctl 参数配置 core 文件名,如 Linux 3.2.0 可通过 /proc/sys/kernel/core_pattern 进行配置。多数实现在相应进程的工作目录中包含 core 文件项,但 Mac OS X 将所有 core 文件都放在 /cores 目录中。
另外,在下列条件下不产生 core 文件:
(1)进程是设置用户 ID 的,而且当前用户并非程序文件的所有者。
(2)进程是设置组 ID 的,而且当前用户并非该程序文件的组所有者。
(3)用户没有写当前工作目录的权限。
(4)文件已存在,而且用户对该文件没有写权限(core 文件的权限通常是用户读/写)。
(5)文件太大。
进程捕捉到信号并对其进行处理时,它就会临时中断正在执行的正常指令序列,转而执行信号处理程序中的指令,在从信号处理程序返回后(如没有调用 exit 或 longjmp)又继续执行。但在信号处理程序中,不能判断捕捉到信号时进程执行到何处。如果进程正在执行 malloc,就可能会对进程造成破坏,因为 malloc 通常为它所分配的存储区维护一个链表,而插入执行信号处理程序时,进程可能正在更改此链表。再比如,若进程正在执行 getpwnam 这种将其结果存放在静态存储单元中的函数,其间插入执行信号处理程序,它又调用这样的函数,则返回给正常调用者的信息就可能会被覆盖。
下表列出了 Single UNIX Specification 说明的在信号处理程序中保证调用安全的函数,它们是可重入的,并被称为异步信号安全的。此外,在信号处理操作期间,它们会阻塞任何会引起不一致的信号发送。
不在该表中的大多数是不可重入的,因为(a)已知它们使用静态数据结构;(b)它们调用 malloc 或 free;(c)它们是标准 I/O 函数(标准 I/O 库的很多实现都以不可重入方式使用全局静态数据结构)。不过即使信号处理程序调用的是上表中的函数,但由于每个线程只有一个 errno 变量,所以信号处理程序可能会修改其原先值。因此,应当在信号处理程序中调用上图中的函数前保存 errno,调用后再恢复 errno。
注意,上图中没有包含 longjmp 和 siglongjmp 之类的函数,因为主例程以非可重入方式正在更新一个数据结构时可能产生信号。如果不是从信号处理程序返回而是调用 siglongjmp,那么该数据结构可能是部分更新的。如果要做到更新全部数据结构,而同时要捕捉某些信号,而这些信号的处理程序又会引起执行 siglongjmp,则在更新时要阻塞此类信号。
这里需要了解的是,在不同的实现中,core 文件的名字可能不同。例如,在 FreeBSD 8.0 中,core 文件名是 cmdname.core,其中 cmdname 是接收到信号的进程所执行的命令名;在 Mac OS 10.6.8 中,core 文件名是 core.pid,其中 pid 是接收到信号的进程的 ID。这些系统允许经 sysctl 参数配置 core 文件名,如 Linux 3.2.0 可通过 /proc/sys/kernel/core_pattern 进行配置。多数实现在相应进程的工作目录中包含 core 文件项,但 Mac OS X 将所有 core 文件都放在 /cores 目录中。
另外,在下列条件下不产生 core 文件:
(1)进程是设置用户 ID 的,而且当前用户并非程序文件的所有者。
(2)进程是设置组 ID 的,而且当前用户并非该程序文件的组所有者。
(3)用户没有写当前工作目录的权限。
(4)文件已存在,而且用户对该文件没有写权限(core 文件的权限通常是用户读/写)。
(5)文件太大。
进程捕捉到信号并对其进行处理时,它就会临时中断正在执行的正常指令序列,转而执行信号处理程序中的指令,在从信号处理程序返回后(如没有调用 exit 或 longjmp)又继续执行。但在信号处理程序中,不能判断捕捉到信号时进程执行到何处。如果进程正在执行 malloc,就可能会对进程造成破坏,因为 malloc 通常为它所分配的存储区维护一个链表,而插入执行信号处理程序时,进程可能正在更改此链表。再比如,若进程正在执行 getpwnam 这种将其结果存放在静态存储单元中的函数,其间插入执行信号处理程序,它又调用这样的函数,则返回给正常调用者的信息就可能会被覆盖。
下表列出了 Single UNIX Specification 说明的在信号处理程序中保证调用安全的函数,它们是可重入的,并被称为异步信号安全的。此外,在信号处理操作期间,它们会阻塞任何会引起不一致的信号发送。
不在该表中的大多数是不可重入的,因为(a)已知它们使用静态数据结构;(b)它们调用 malloc 或 free;(c)它们是标准 I/O 函数(标准 I/O 库的很多实现都以不可重入方式使用全局静态数据结构)。不过即使信号处理程序调用的是上表中的函数,但由于每个线程只有一个 errno 变量,所以信号处理程序可能会修改其原先值。因此,应当在信号处理程序中调用上图中的函数前保存 errno,调用后再恢复 errno。
注意,上图中没有包含 longjmp 和 siglongjmp 之类的函数,因为主例程以非可重入方式正在更新一个数据结构时可能产生信号。如果不是从信号处理程序返回而是调用 siglongjmp,那么该数据结构可能是部分更新的。如果要做到更新全部数据结构,而同时要捕捉某些信号,而这些信号的处理程序又会引起执行 siglongjmp,则在更新时要阻塞此类信号。
发表评论
-
打开伪终端设备
2018-07-09 20:50 1246在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
伪终端概述
2018-06-02 11:05 1529伪终端就是指,一个应用程序看上去像一个终端,但事实上它 ... -
终端窗口大小和 termcap
2018-05-29 22:39 790多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 936终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 565尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 933虽然大多数终端设 ... -
终端属性和选项标志
2018-05-20 07:40 706tcgetattr 和 tcsetattr ... -
终端特殊输入字符
2018-05-17 06:33 807终端支持下表所示的特殊输入字符。 为了更改 ... -
终端 I/O 综述
2018-05-10 07:56 431终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 575在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 942在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 612在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 488消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 477有 3 种称作 XSI IPC ... -
IPC 通信之 FIFO
2018-02-06 22:55 410FIFO 也被称为命名管道,未命名的管道只能在两个相关 ... -
IPC 通信之管道
2018-01-30 22:22 380管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 875readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 448POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 571记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 432UNIX 系统中,守护进程遵循下列通用惯例。 ...
相关推荐
### Unix下进程收到信号后的默认动作 在Unix系统中,信号是进程间通信的一种机制,主要用于通知接收进程某个事件的发生。这些信号可以被用来中断、暂停或者终止进程。本篇文章将详细阐述各种信号及其默认行为。 ##...
如果被设置为SIG_DFL,则信号将采取默认动作。 - **sa_mask**:在执行信号处理函数期间要屏蔽的信号集合。这意味着在信号处理函数执行期间,这些信号将不会被处理,直到信号处理函数执行完毕。 - **sa_flags**:一组...
总结来说,Linux中的信号处理机制允许进程对特定事件做出响应,而信号的捕捉和处理涉及到信号掩码的设置、信号处理函数的安装和执行,以及在处理信号时对系统调用的中断与重启动的策略。正确理解和使用信号处理是...
3. **信号类型**:信号分为可忽略信号、默认动作信号、可捕捉信号。其中,可捕捉信号可以通过注册信号处理函数来改变其默认行为。 #### 三、问题分析 根据给定的部分内容,我们可以看到一个典型的信号处理不当所...
2. **信号处理函数(Signal Handler)**:当进程接收到信号时,可以选择忽略信号、默认处理或定义自己的处理函数。自定义处理函数可以执行特定的操作,比如保存状态、清理资源,然后退出进程。 3. **信号注册...
- **`SA_ONESHOT`**:处理器只运行一次,之后信号处理将恢复为默认动作。 - **`SA_RESETHAND`**:信号处理器执行后自动重置为默认值。 - **`SA_RESTART`**:如果信号处理函数被打断,则系统调用将自动重启。 - *...
`overview of signals.doc`文档可能会详细介绍信号的基本属性,包括信号的种类、默认动作(忽略、终止进程、核心转储等)以及信号的编号。信号可以通过信号名(如SIGINT)或信号编号(如2)进行引用。 `sigaction....
| 信号名称 | 信号值 | 默认动作 | 发生原因 | |----------|--------|----------|----------| | `SIGHUP` | 1 | A | 终端挂起或控制进程终止 | | `SIGINT` | 2 | A | 键盘中断(如 break 键被按下) | | `SIGQUIT` |...
每个信号都有其默认的处理动作,如忽略、终止进程或调用用户指定的处理函数。通过`signal`函数,程序员可以改变这些默认行为,实现自定义的信号处理。 3. 信号的处理函数 进程可以为特定信号注册信号处理函数,当...
- 默认处理模型:Linux为每个信号都提供了一个默认的处理动作,例如,默认动作是终止进程并产生core dump的SIGSEGV信号。 - 自定义处理模型:通过编写自定义信号处理函数来处理信号,可以在处理函数中执行特定的任务...
每种信号都有特定的值和处理动作,比如SIGINT(2)通常代表键盘中断,SIGKILL(9)则是不可阻塞、不可忽略的强制终止信号。 3. **信号处理机制** 进程通过`signal`系统调用来设定对特定信号的处理方式。在进程表中...
在描述中提到的"重写按键的事件处理函数",意味着我们不再依赖默认的信号和槽机制,而是自定义一个函数来处理按键事件。这通常涉及到以下步骤: 1. **识别目标事件**:在本例中,目标事件是按键事件,可能对应于`...
3. 对于不可重入的函数,在信号处理函数中调用时需要特别小心,以避免竞态条件的发生。 4. 对于`SIGKILL`和`SIGSTOP`信号,进程不能改变它们的默认处理方式。 总而言之,Linux下的Signal信号是一种强大的进程间通信...
`struct sigaction`结构体定义了信号处理的行为,包括处理函数、信号掩码和动作类型等。通过`sigaction`,我们可以设置信号为被忽略、执行默认操作或调用自定义处理函数,并且可以选择是否阻塞其他信号。 以下是一...
`signal`函数有三种处理模式:忽略信号、默认处理和自定义处理。然而,`signal`函数存在一些限制,如不能处理多个相同信号到达的情况,可能导致信号丢失。 3. `sigaction`信号处理机制 为了解决`signal`函数的局限...
接收信号后,进程可以选择忽略、执行默认动作或者执行自定义的信号处理函数。 4. **信号的屏蔽**:进程可以临时屏蔽某些信号,防止在特定时间段内接收它们。这在某些情况下是必要的,比如在执行关键操作时避免信号...
信号的处理方式包括忽略、捕捉(自定义处理)和执行默认动作。 在Linux中,信号有特定的名称,如SIGABRT(程序异常终止)、SIGALRM(闹钟信号)等,这些名称以SIG开头。在头文件`<signal.h>`中,每个信号都被定义为...
进程接收到信号后,可以有三种响应方式:忽略信号、捕获信号(通过用户定义的函数处理)或执行默认动作。例如,Ctrl+C或Delete键发送的中断信号可以使程序停止运行,进程可以选择直接退出或执行预设的处理程序。 在...