一、信号分类
(1)、可靠信号不可靠信号
- 进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。
- 早期unix下的不可靠信号主要指的是进程可能对信号做出错误的反应以及信号可能丢失。
- linux支持不可靠信号,但是对不可靠信号机制做了改进:在调用完信号处理函数后,不必重新调用该信号的安装函数(信号安装函数是在可靠机制上的实现)。因此,linux下的不可靠信号问题主要指的是信号可能丢失。
(2)、实时信号非实时信号
二、信号发送
(1)、kill 向某进程发送信号
函数声明:
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
函数参数:
进程号,信号代码
If pid is positive, then signal sig is sent to the process with the ID specified by pid.
If pid equals 0, then sig is sent to every process in the process group of the calling process.
If pid equals -1, then sig is sent to every process for which the calling process has permission to send signals, except for process 1(init), but see below.(除1号进程和自身)
If pid is less than -1, then sig is sent to every process in the process group whose ID is -pid.
If sig is 0, then no signal is sent, but error checking is still performed; this can be used to check for the existence of a process ID or process group ID.
返回值:
成功返回0,失败返回-1,并设置errno.
(2)、raise 给本进程发送信号
函数声明:
#include <signal.h>
int raise(int sig);
函数参数:
信号代码
返回值:
成功返回0,失败返回非0
(3)、killpg 给进程组发送信号
函数声明:
#include <signal.h>
int killpg(int pgrp, int sig);
函数参数:
进程组号,信号代码
返回值:同kill
(4)、sigqueue 给进程发送信号,支持排队,可附带信息
函数声明:
<pre name="code" class="cpp">#include <signal.h>
int sigqueue(pid_t pid, int sig, const union sigval value);
函数参数:进程号,信号代码,附带信息
返回值:同kill
示例:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}while(0)
void handle(int sig);
int main(int argc,char* argv[])
{
if ( signal(SIGUSR1,handle) == SIG_ERR)
ERR_EXIT("signal error");
pid_t pid = fork();
if (pid == -1)
ERR_EXIT("fork error");
if (pid == 0)
{
//kill(getppid(),SIGUSR1);//进程
//kill(-getpgrp(),SIGUSR1);//进程组
//raise(SIGUSR1);//自己
//killpg(getpgrp(),SIGUSR1);//进程组
exit(EXIT_SUCCESS);
}
int n;
n = 5;
do
{
n = sleep(n);
}while(n > 0);
return 0;
}
void handle(int sig)
{
printf("recv a sig=%d\n",sig);
}
三、pause