singal 资料

#define SIGHUP   1
进程由於控制终端死去或者控制终端发出起命令
#define SIGINT   2
键盘中断所产生的信号

#define SIGQUIT   3
键盘终止

#define SIGILL   4
非法的指令

#define SIGTRAP   5
进程遇到一个追踪(trace)或者是一个中断嵌套

#define SIGABRT   6
由abort系统调用所产生的中断信号

#define SIGIOT   6
类似於SIGABRT

#define SIGBUS   7
进程试图使用不合理的记忆体

#define SIGFPE   8
浮点异常

#define SIGKILL   9
KILL

#define SIGUSR1  10
用户自定义

#define SIGSEGV  11
段错误

#define SIGUSR2  12
用户自定义

#define SIGPIPE  13
管道操作时没有读只写

#define SIGALRM  14
由alarm系统调用产生的timer时钟信号

#define SIGTERM  15
收到终端信号的进程

#define SIGSTKFLT 16
堆叠错误

#define SIGCHLD  17
子进程向父进程发出的子进程已经stop或者终止的信号

#define SIGCONT  18
继续运行的信号

#define SIGSTOP  19
stop

#define SIGTSTP  20
键盘所产生的stop信号

#define SIGTTIN  21
当运行在後状态时却需要读取stdin的资料

#define SIGTTOU  22
当运行在後状态时却需要写向stdout

#define SIGURG  23
socket的紧急情况

#define SIGXCPU  24
进程超额使用CPU分配的时间

#define SIGXFSZ  25
进程使用了超出系统规定文件长度的文件

#define SIGVTALRM 26
内部的alarm时钟过期

#define SIGPROF  27
在一个程式段中描绘时钟集过期

#define SIGWINCH 28
终端视窗的改变

#define SIGIO  29
非同步IO

#define SIGPOLL  SIGIO
pollable事件发生


如何去册一个信号handler?

  首先,用sigprocmask设置或者更改信号mask,如果信号mask没有被设置,所有的信号采用预设的
方式处理,一旦设置了mask,就使用sigaction俘获信号

int sigprocmask(int how,const sigset_t,sigset_t *oldset);
how有以下值:
SIG_BLOCK 集合中包含额外的信号需要阻塞
SIG_UNBLOCK 集合中包含额外的信号需要不阻塞
SIG_SETMASK 集合中包含新的信号mask

struct sigaction{
 void (*sa_handler)(int);
 sigset_t sa_mask;
 int sa_flags;
 void (*sa_restorer)(void);
};

*sa_handler指向信号处理的函数,sa_handler的参数可以是SIG_DFL,

,启动信号处理的预设值,如果是SIG_IN,将忽略信号.

信号处理的过程中,需要使用sa_mask定义一套需要遮罩的信号

sa_flags是改变sa_handler行为的mask,它可以是以下几种:

(1)SA_NOCLDSTOP
忽略子进程发出的SIGSTOP,SIGTSTP,SIGTTIN,SIGTTAU

(2)SA_ONESHOT或者SA_RESETHAND
册的定制的信号处理仅仅被执行一次,在它被执行後,信号的缺省操作将被还原

(3)SA_RESTART
使能可重起的系统调用

(4)SA_NOMASK或者SA_NODEFER

dont prevent the signal from being recieved within its own handler
忽略sa_restorer,它无需使用  
<think>好的,用户询问的是“signal 18”在编程或系统上下文中的相关信息或处理方法。我需要先理解这个信号是什么,然后给出准确的解释和解决方法。 首先,在Unix/Linux系统中,信号是进程间通信的一种机制,用于通知进程发生了某个事件。常见的信号如SIGINT(2)、SIGKILL(9)、SIGSEGV(11)等。每个信号都有一个编号和对应的宏定义名称。但用户提到的“signal 18”可能对应的是哪个信号呢? 查阅资料,Unix/Linux信号编号中,18号信号对应的是SIGCHLD。SIGCHLD在子进程终止或停止时发送给父进程。这个信号通常用于父进程回收子进程的资源,避免僵尸进程的产生。例如,在编写多进程程序时,父进程需要处理SIGCHLD信号来调用waitpid()回收子进程。 不过,也有可能用户的环境或特定系统有不同的信号定义。例如,某些嵌入式系统或旧版本系统可能信号编号有所不同,但大多数现代系统遵循标准。需要确认这一点。 接下来,用户可能需要了解如何处理SIGCHLD信号。处理方式通常包括注册信号处理函数,并在其中调用waitpid()。例如,在C语言中使用signal()或sigaction()函数来设置处理函数。同时,需要注意处理函数的可重入性,避免在信号处理函数中调用不可重入的函数。 此外,可能用户遇到了未处理的SIGCHLD导致的问题,比如僵尸进程累积。需要解释如何检测和解决这类问题,比如检查代码中是否正确处理了子进程的终止。 还需要考虑其他可能性,比如用户可能混淆了信号名称和编号,或者在某些编程语言或框架中有特定的信号使用方式。例如,在Python中使用subprocess模块时,如何处理子进程的信号。 最后,生成相关问题时,需要覆盖信号的基本概念、处理机制、常见问题及解决方法,以及实际应用中的例子。确保问题能够帮助用户深入理解信号处理的相关知识。</think>### 信号18的解释与处理方法 在Unix/Linux系统中,**信号18对应的是`SIGCHLD`**(子进程状态变更信号)。当子进程终止、被中断或恢复执行时,操作系统会向父进程发送此信号,用于通知父进程回收子进程资源(如进程描述符)[^1]。 #### 典型场景 多进程编程中,父进程未正确处理`SIGCHLD`可能导致: 1. **僵尸进程(Zombie Process)**:子进程已终止但未被回收 2. **资源泄漏**:长期未回收的进程占用系统资源 #### 解决方法(C语言示例) ```c #include <signal.h> #include <sys/wait.h> void sigchld_handler(int sig) { int status; while (waitpid(-1, &status, WNOHANG) > 0); // 非阻塞回收所有终止子进程 } int main() { signal(SIGCHLD, sigchld_handler); // 注册信号处理函数 if (fork() == 0) { // 子进程逻辑 exit(0); } // 父进程继续执行 while(1); return 0; } ``` #### 关键注意事项 1. **处理函数设计**:需使用`WNOHANG`标志避免阻塞父进程 2. **信号丢失处理**:需循环调用`waitpid()`确保回收所有终止进程 3. **可重入函数**:信号处理器中仅调用异步信号安全函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值