信号 | 含义 |
---|---|
SIGABORT | 进程异常终止 |
SIGALRM | 超时警告 |
SIGFPE | 浮点运算异常 |
SIGHUP | 连接挂断 |
SIGILL | 非法指令 |
SIGINT | 终端中断 |
SIGKILL | 终止进程(此信号无法被捕获或忽略) |
SIGPIPE | 向无读进程的管道写数据 |
SIGQUIT | 终端退出 |
SIGSEGV | 无效内存访问 |
SIGTERM | 终止 |
SIGUSR1 | 用户定义信号1 |
SIGUSR2 | 用户定义信号2 |
SIGCHLD | 子进程已经停止或退出(默认被忽略) |
SIGCONT | 继续执行暂停进程 |
SIGSTOP | 停止执行(此信号无法被捕获或忽略) |
SIGTSTP | 终端挂起 |
SIGTTIN | 后台进程尝试读操作 |
SIGTTOU | 后台进程尝试写操作 |
在上述信号中,除了SIGCHLD、SIGCONT之外,其余的信号若没有实现安排捕获,则进程会立刻终止。
signal函数为指定信号绑定处理该信号的函数,函数原型如下:
#include
void (*signal(int sig, void (*func)(int))))(int);
参数说明:
特殊值 | 作用 |
---|---|
SIG_IGN | 忽略信号 |
SIG_DFL | 恢复默认行为 |
kill函数可以向包括它本身在内的其它进程发送一个信号:
#include
#include
int kill(pid_t pid, int sig);
参数说明:
alarm函数用来在指定时间之后向自身发送一个SIGALRM信号:
#include
unsigned int alarm(unsigned int seconds);
由于处理的延时和时间调度的不确定性,实际闹钟时间将比预先安排的要稍微延后。需要注意的是,每个进程只有一个闹钟时间,若在接收到SIGALRM信号之前再次调用alarm函数,则闹钟重新开始计时。
pause的作用是把程序的执行挂起直到有一个信号出现为止:
#include
int pause(void);
sigaction函数指定在接收到参数sig指定的信号后应该采取的行动:
#include
int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);
struct sigaction{
void (*) (int) sa_handler; #信号处理函数指针
sigset_t sa_mask; #被阻塞的信号集合
int sa_flags; #标志位
};
参数说明:
sigaction结构中的sa_mask成员指定了一个信号集,在调用sa_handler所指向信号处理函数之前,该信号集将被加入到进程的信号屏蔽字中,这些信号将被阻塞且不会传递给该进程的信号。设置信号屏蔽字可以防止前面看到的信号在它的处理函数还未运行结束时就被接收到的情况。
sigaction标志值及其作用:
标志值 | 作用 |
---|---|
SA_NOCLDSTOP | 子进程停止时不产生SIGCHLD信号 |
SA_RESETHAND | 将对此信号的处理方式在信号处理函数的入口处重置为SIG_DFL |
SA_RESTART | 重启可中断的函数而不是给出EINTR错误 |
SA_NODEFER | 捕获到信号时不将它添加到信号屏蔽字中 |
#include
int sigaddset(sigset_t *set, int signo); #将某个信号添加到信号集中
int sigemptyset(sigset_t *set); #将信号集初始化为空
int sigfillset(sigset_t *set); #将信号集初始化为包含所有已定义的信号
int sigdelset(sigset_t *set, int signo); #将某个信号从信号集中删去
int sigismember(sigset_t *set, int signo); #判断一个信号是否在信号集中
sigprocmask函数可以根据参数how指定的方法修改进程的信号屏蔽字。新的信号屏蔽字由参数set指定,而原先的信号屏蔽字将保存到信号集oset中。
#include
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
参数how的取值如下:
参数 | 作用 |
---|---|
SIG_BLOCK | 把参数set中的信号添加到信号屏蔽字中 |
SIG_SETMASK | 把信号屏蔽字设置为参数set中的信号 |
SIG_UNBLOCK | 从信号屏蔽字中删除参数set中的信号 |
sigpending函数的作用是将被阻塞的信号中停留在待处理状态的一组信号写到参树set指向的信号集中。
#include
int sigpending(sigset_t *set);
sigsuspend函数将进程的屏蔽字替换为由参数sigmask给出的信号集,然后挂起程序的执行,程序将在信号处理函数执行完毕后继续执行。
#include
int sigsuspend(const sigset_t *sigmask);