sigaction信号处理函数
#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
struct sigaction
{
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
siginfo_t {
int si_signo; /* Signal number */
int si_errno; /* An errno value */
int si_code; /* Signal code */
int si_trapno; /* Trap number that caused hardware-generated signal(unused on most architectures) */
pid_t si_pid; /* Sending process ID */
uid_t si_uid; /* Real user ID of sending process */
int si_status; /* Exit value or signal */
clock_t si_utime; /* User time consumed */
clock_t si_stime; /* System time consumed */
sigval_t si_value; /* Signal value */
int si_int; /* POSIX.1b signal */
void *si_ptr; /* POSIX.1b signal */
int si_overrun; /* Timer overrun count; POSIX.1b timers */
int si_timerid; /* Timer ID; POSIX.1b timers */
void *si_addr; /* Memory location which caused fault */
long si_band; /* Band event (was int inglibc 2.3.2 and earlier) */
int si_fd; /* File descriptor */
short si_addr_lsb; /* Least significant bit of address*/
}
该函数的第一个参数为信号的值,可以为除SIGKILL及SIGSTOP外的任何一个特定有效的信号(为这两个信号定义自己的处理函数,将导致信号安装错误),第二个参数是指向结构sigaction的一个实例的指针,在结构 sigaction的实例中,指定了对特定信号的处理,可以为空,进程会以缺省方式对信号处理,第三个参数oldact指向的对象用来保存原来对相应信号的处理,可指定oldact为NULL。函数成功返回0,失败返回-1。
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
void func(int signo)
{
printf("ths signal status is %d\n",signo);
}
int main()
{
struct sigaction act;
act.sa_handler=func;
sigaction(SIGINT,&act,NULL);
for(;;)
{
pause();
}
return 0;
}
sigqueue信号发送函数
#include <signal.h>
int sigqueue(pid_t pid, int sig, const union sigval value);
union sigval
{int sival_int;
void *sival_ptr;
};
和kill函数相比Int kill(pid_t pid, int siq)多了可以传递参数
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
void func(int signo, siginfo_t * s, void *p)
{
printf("signal status is %d\n",signo);
printf("recv msg is %d\n",s->si_int);
}
int main()
{
pid_t pid;
struct sigaction act;
act.sa_sigaction=func;
act.sa_flags=SA_SIGINFO;
sigaction(SIGINT,&act,NULL);
sigemptyset(&act.sa_mask);
pid=fork();
if(pid==0)
{
union sigval sv;
sv.sival_int=666;
sigqueue(getppid(),SIGINT,sv);
exit(0);
}
for(;;)
{
pause();
}
return 0;
}