linux编程中会对信号进行操作,经常进行捕捉和发送;经常用到对信号的捕捉和发送函数有两对。
1、比较简单的:kill()(用于发送信号)和signal()(用于捕捉信号)
2、高级一些的:sigaction()(用于捕捉信号)和sigqueue()(用于发送信号)
下面是简单的应用:
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 */
int si_band; /* Band event */
int si_fd; /* File descriptor */
}
union sigval
{
int sival_int;
void *sival_ptr;
};
struct sigaction
{
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
上面的结构体都是系统函数已经定于好的
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
void my_sigaction(int signo, siginfo_t *info, void *acInfo)
{
printf("Cat a singal:%d\n",signo);
printf("send signal id:%d\n",info->si_pid);
printf("Reveive value_wordr:%s\n",(char *)info->si_value.sival_ptr);
}
int main()
{
char buf[]={"great"};
//在父进程中创建一个子进程
int iFork = fork();
if (iFork > 0)//父进程
{
struct sigaction act;
memset(&act,0,sizeof(act));
/*
//当act.sa_flags = 0时函数sigaction的使用方法
//给act设置值
act.sa_flags = 0;//使用结构体struct sigaction中的void (*sa_handler)(int)去处理信号
act.sa_handler = signal_handler;//设置函数指针
sigemptyset(&act.sa_mask);//清空结构体struct sigaction中的sa_mask,避免随机值
//信号安装
sigaction(SIGINT, &act,NULL);
*/
//当act.sa_flags = SA_SIGINFO时函数sigaction的使用方法
//给act设置值
act.sa_flags = SA_SIGINFO;//使用结构体struct sigaction中的void (*sa_sigaction)(int, siginfo_t *, void *);去处理信号
act.sa_sigaction = my_sigaction;//设置函数指针
sigemptyset(&act.sa_mask);//清空结构体struct sigaction中的sa_mask,避免随机值
//信号安装
sigaction(SIGINT, &act,NULL);
while (1)
{
pause();
}
}
else if (iFork == 0)//子进程
{
sleep(1);
union sigval val;
val.sival_ptr = (void *)buf;
sigqueue(getppid(),SIGINT,val);
}
else
{
perror("fork error:");
}
return 0;
}