`

信号默认处理动作及可重入函数

阅读更多
    下表列出了每种信号的默认处理动作(有些实现支持更多信号),以及支持此信号的系统。其中,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,则在更新时要阻塞此类信号。
  • 大小: 48.8 KB
  • 大小: 26.2 KB
分享到:
评论

相关推荐

    Unix下进程收到信号后的默认动作

    ### Unix下进程收到信号后的默认动作 在Unix系统中,信号是进程间通信的一种机制,主要用于通知接收进程某个事件的发生。这些信号可以被用来中断、暂停或者终止进程。本篇文章将详细阐述各种信号及其默认行为。 ##...

    信号捕捉函数sigaction

    如果被设置为SIG_DFL,则信号将采取默认动作。 - **sa_mask**:在执行信号处理函数期间要屏蔽的信号集合。这意味着在信号处理函数执行期间,这些信号将不会被处理,直到信号处理函数执行完毕。 - **sa_flags**:一组...

    Linux信号量处理

    总结来说,Linux中的信号处理机制允许进程对特定事件做出响应,而信号的捕捉和处理涉及到信号掩码的设置、信号处理函数的安装和执行,以及在处理信号时对系统调用的中断与重启动的策略。正确理解和使用信号处理是...

    Linux信号处理方法的问题

    3. **信号类型**:信号分为可忽略信号、默认动作信号、可捕捉信号。其中,可捕捉信号可以通过注册信号处理函数来改变其默认行为。 #### 三、问题分析 根据给定的部分内容,我们可以看到一个典型的信号处理不当所...

    信号中断处理示例代码

    2. **信号处理函数(Signal Handler)**:当进程接收到信号时,可以选择忽略信号、默认处理或定义自己的处理函数。自定义处理函数可以执行特定的操作,比如保存状态、清理资源,然后退出进程。 3. **信号注册...

    unix信号和处理方式

    - **`SA_ONESHOT`**:处理器只运行一次,之后信号处理将恢复为默认动作。 - **`SA_RESETHAND`**:信号处理器执行后自动重置为默认值。 - **`SA_RESTART`**:如果信号处理函数被打断,则系统调用将自动重启。 - *...

    Linux下信号介绍与函数

    `overview of signals.doc`文档可能会详细介绍信号的基本属性,包括信号的种类、默认动作(忽略、终止进程、核心转储等)以及信号的编号。信号可以通过信号名(如SIGINT)或信号编号(如2)进行引用。 `sigaction....

    c语言信号处理

    | 信号名称 | 信号值 | 默认动作 | 发生原因 | |----------|--------|----------|----------| | `SIGHUP` | 1 | A | 终端挂起或控制进程终止 | | `SIGINT` | 2 | A | 键盘中断(如 break 键被按下) | | `SIGQUIT` |...

    c语言信号处理.pdf

    每个信号都有其默认的处理动作,如忽略、终止进程或调用用户指定的处理函数。通过`signal`函数,程序员可以改变这些默认行为,实现自定义的信号处理。 3. 信号的处理函数 进程可以为特定信号注册信号处理函数,当...

    Linux信号在进程控制中的应用

    - 默认处理模型:Linux为每个信号都提供了一个默认的处理动作,例如,默认动作是终止进程并产生core dump的SIGSEGV信号。 - 自定义处理模型:通过编写自定义信号处理函数来处理信号,可以在处理函数中执行特定的任务...

    Linux信号signal处理机制[参考].pdf

    每种信号都有特定的值和处理动作,比如SIGINT(2)通常代表键盘中断,SIGKILL(9)则是不可阻塞、不可忽略的强制终止信号。 3. **信号处理机制** 进程通过`signal`系统调用来设定对特定信号的处理方式。在进程表中...

    重写事件处理函数.rar

    在描述中提到的"重写按键的事件处理函数",意味着我们不再依赖默认的信号和槽机制,而是自定义一个函数来处理按键事件。这通常涉及到以下步骤: 1. **识别目标事件**:在本例中,目标事件是按键事件,可能对应于`...

    Linux下Signal信号.pdf

    3. 对于不可重入的函数,在信号处理函数中调用时需要特别小心,以避免竞态条件的发生。 4. 对于`SIGKILL`和`SIGSTOP`信号,进程不能改变它们的默认处理方式。 总而言之,Linux下的Signal信号是一种强大的进程间通信...

    linux进程间通信——信号机制

    `struct sigaction`结构体定义了信号处理的行为,包括处理函数、信号掩码和动作类型等。通过`sigaction`,我们可以设置信号为被忽略、执行默认操作或调用自定义处理函数,并且可以选择是否阻塞其他信号。 以下是一...

    Linux信号基础知识

    `signal`函数有三种处理模式:忽略信号、默认处理和自定义处理。然而,`signal`函数存在一些限制,如不能处理多个相同信号到达的情况,可能导致信号丢失。 3. `sigaction`信号处理机制 为了解决`signal`函数的局限...

    信号机制实现设计说明书

    接收信号后,进程可以选择忽略、执行默认动作或者执行自定义的信号处理函数。 4. **信号的屏蔽**:进程可以临时屏蔽某些信号,防止在特定时间段内接收它们。这在某些情况下是必要的,比如在执行关键操作时避免信号...

    linux 信号详解

    信号的处理方式包括忽略、捕捉(自定义处理)和执行默认动作。 在Linux中,信号有特定的名称,如SIGABRT(程序异常终止)、SIGALRM(闹钟信号)等,这些名称以SIG开头。在头文件`<signal.h>`中,每个信号都被定义为...

    Linux编程之信号.pdf

    进程接收到信号后,可以有三种响应方式:忽略信号、捕获信号(通过用户定义的函数处理)或执行默认动作。例如,Ctrl+C或Delete键发送的中断信号可以使程序停止运行,进程可以选择直接退出或执行预设的处理程序。 在...

Global site tag (gtag.js) - Google Analytics