Linux信号
1.linux信号的种类
kill –l
2.signal函数
设置进程在接收到信号时的动作
typedef void (*sighandler_t)(int)
sighandler_t signal(int signum, sighandler_thandler);
signal会根据参数signum指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。如果参数handler不是函数指针,则必须是常数SIG_IGN(忽略该信号)或SIG_DFL(对该信号执行默认操作)。handler是一个函数指针,它所指向的参数有一个int型参数,且返回值的类型为void。
signal函数执行成功时返回以前信号处理函数指针,有错误发生时返回SIG_ERR(-1)。
SIGKILL和SIGSTOP两个信号不能被捕捉或忽略。
3.sigaction函数
检查或设置进程在接收到信号时的动作。
int sigaction(int signum, const structsigaction *act, struct sigaction *oldact);
sigaction会根据参数signum指定的信号编号来设置该信号的处理函数。参数signum可以是SIGKILL和SIGSYOP以外的任何信号。如果参数act不是空指针,则signum设置新的信号处理函数;如果oldact不是空指针,则旧的信号处理函数将被存储在oldact中。
struct sigaction {
void(*sa_handler)(int);
void(*sa_sigaction)(int, siginfo_t *, void *);
sigset_tsa_mask;
intsa_flags;
void(*sa_restorer)(void);
};
sa_handler和sa_sigaction在某些一个有效体系结构上被定义为共用体,即这两个值在某一个时刻只有一个有效。这两个值可以是SIG_DFL或SIG_IGN或者是一个信号处理函数的函数名。
sa_restorer已经不再使用。
4.pause函数使用调用进程挂起直至捕捉到一个信号。
int pause(void);
5.kill函数用来发送信号给指定的进程
int kill(pid_t pid, int sig);
pid参数
如果pid是正数,则发送信号sig给进程号为pid的进程
如果pid为0,则发送信号sig给当前进程所属进程组里的所有进程
如果pid为-1,则把信号sig广播至系统内除1号进程(init进程)和自身以外的所有进程
如果参数sig是0,则kill仍执行正常的错误检查,但不发送信号。可以利用这一点来确定某进程是否有权向另外一个进程发送信号。如果向一个并不存在的进程发送空信号,则kill返回-1,errno则被设置为ESRCH。
函数执行成功返回0,当有错误发生时则返回-1。
只有具有root权限的进程才能向其他任一进程发送信号,非root权限的进程只能向属于同一个组或同一个用户的进程发送信号。
6.raise函数是ANSI C而非POSIX标准定义的,用来给调用它的进程发送信号。
int raise(int sig);
成功返回0,失败返回非0值。
7.sigquence函数支持信号带有参数,从而可以与函数sigaction配合使用。
int sigqueue(pid_t pid, int sig, const unionsigval value);
sigqueue不能给一组进程发送信号。
union sigval{
intsival_int;
void*sival_ptr;
};
当接收进程的信号处理函数是由sigaction函数设置的并且设置了SA_SIGINFO标志时,接收进程可以从siginfo_t结构的si_value域取得信号发送时携带的数据。
成功返回0,失败返回-1
8.alarm函数可以用来设置定时器,定时器超时将产生SIGALARM信号给调用进程。
unsigned int alarm(unsigned int seconds);
参数seconds表示设定的秒数,经过seconds后,内核将给调用该函数的进程发送SIGALARM信号。如果seconds为0,则不再发送SIGALARM信号。
alarm只设定发送一次信号,如果需要多次发送,就要对alarm进行多次调用。
9.int getitimer(int which, struct itimerval*val);
int setitimer(int which, const structitimerval *val, struct itimerval *ovalue);
which用来指定使用哪一个定时器,根据参数which可单独设定每个定时器
10.abort函数用来向进程发送SIGABRT信号
void abort(void);
代码:发送信号,接收
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
int SIGNUM = 50; // signal num
void igaction(int sig, siginfo_t *siginfo,void *arg)
{
printf("sig= %d\n", sig);
printf("recvvalue = %d\n", (int)siginfo->si_value.sival_int);
}
int main(int argc, char **argv)
{
if(argc != 1)
{
printf("Usage:");
printf("signal\n");
return-1;
}
structsigaction act, oldact;
act.sa_sigaction= &igaction;
act.sa_flags= SA_SIGINFO;
intnErr;
nErr= sigaction(SIGNUM, &act, &oldact);
unionsigval value;
value.sival_int= 3000;
nErr= sigqueue(getpid(), SIGNUM, value);
if(nErr != 0)
{
printf("signalsend err!\n");
return-1;
}
usleep(1000000);
return0;
}