信号
可靠信号和不可靠信号
不可靠信号会丢失,也就是说连续发送四个信号2给某个进程去处理,他可能会只处理三个以下信号。
1-32 不可靠信号
34-.... 可靠信号
signal
signal函数,处理两个信号时,第一个信号会被中断,完成该信号之后再回去处理被中断的信号,但如果是处理相同的信号的话,不会中断,而是会排队阻塞,一个个执行。

/*测试进程发送信号给另一个进程*/
#include"process.h"
void func(int sig)
{
if(sig==SIGINT)
for(int i=0;i<5;i++){
printf("i catch the %d\n",sig);
sleep(1);
}
if(sig==15)
for(int i=0;i<5;i++){
printf("i catch the %d\n",sig);
sleep(1);
}
}
int main()
{
pid_t pid=Fork();
if(pid==0){
signal(SIGINT,func);
signal(15,func);
while(1)
{
printf("i am ing\n");
sleep(1);
}
}
else{
//sleep(5);
//kill(pid,SIGINT);
}
return 0;
}

信号阻塞
信号集
相当于一个数组,里面都是信号
#include <signal.h>
int sigemptyset(sigset_t *set);
清空信号集
int sigfillset(sigset_t *set);
把所有信号都加入信号集
int sigaddset(sigset_t *set, int signum);
//把参数一信号加入信号集
int sigdelset(sigset_t *set, int signum);
从信号集中删除一个信号
int sigismember(const sigset_t *set, int signum);
判断某信号在不在这个信号集中

signal处理函数func 对2,15进行处理
当i<20的时候,对15信号进行了阻塞处理,这样即使如下连续发送信号,也不会对15信号进行处理,只有当i>20,对15信号进行非阻塞处理后。15信号才会被处理
kill 2 该进程
kill -15 该进程

功能更为强大的sigaction
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);
};

阻塞一个信号

网友评论