您的位置:首页 > 运维架构 > Linux

linux信号

2015-11-06 11:39 267 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: