sigaction函数
功能:读取和修改与指定信号相关联的处理动作。
函数定义
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
返回值:
成功返回0
出错返回-1。
signal是指定信号的编号。若act指针非空,则根据act修改该信号的处理动作。若oldact指针非空,则通过oact传出该信号原来的处理动作。act和oldact指向sigaction结构体:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
参数:
前两个参数sa_handler和sa_sigaction都是自定义信号处理函数,同样,sa_handler有两个默认值:SIG_DFL和SIG_IGN。区别在于sa_sigaction是为实时信号而设定的(也支持非实时信号),第二个参数是指向siginfo_t结构的指针,结构中包含信号携带的数据值,第三个参数暂时没有使用(POSIX没有规范使用该指针的标准);
sa_mask是屏蔽信号集;
siginfo_t {
int si_signo; /* Signal number */
int si_errno; /* An errno value */
int si_code; /* Signal code */
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 */
void *si_addr; /* Memory location which caused fault */
下面代码用si_int,si_value,si_pid来处理信号。
发送端代码
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void handler(int signum, siginfo_t *info, void *context)
{
printf("get signum=%d\n",signum);
if(context!=NULL){
printf("get data=%d\n",info->si_int);
printf("get data=%d\n",info->si_value.sival_int);
printf("from:%d\n",info->si_pid);
}
}
int main()
{
struct sigaction act;
printf("pid =%d\n",getpid());
act.sa_sigaction=handler;
act.sa_flags=SA_SIGINFO;//be able to get message
sigaction(SIGUSR1,&act,NULL);
while(1);
return 0;
}
接收端代码
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc,char **argv)
{
int signum;
int pid;
signum=atoi(argv[1]);
pid=atoi(argv[2]);
union sigval value;
value.sival_int=100;
sigqueue(pid,signum,value);
printf("%d,done\n",getpid());
return 0;
}