大家好,又见面了,我是你们的朋友全栈君。
sigprocmask: 用于随时添加信号屏蔽字 ;
sigaction : signal增强版本, 当处理信号时, 可以随意添加信号屏蔽字
sigset_t newmask,oldmask,pendmask;
signal(SIGINT,sig_handler);
sigemptyset(&newmask);
sigaddset(&newmask,SIGINT);
//屏蔽SIGINT
sigprocmask(SIG_BLOCK,&newmask,&oldmask);
//按ctrl+c
for(int i =0 ; i < 3 ; ++i){
sleep(1);
write(1,".",1);
}
//SIGINT 是否置位
sigpending(&pendmask);
printf("pend sigint ? %d\n",sigismember(&pendmask,SIGINT));
puts("restore mask");
//还原
sigprocmask(SIG_SETMASK,&oldmask,NULL);
puts("sigint unlock");
while(1){
sleep(1);
write(1,".",1);
}
void sig_handler(int sig,siginfo_t * info, void *p){
printf("self pid:%d, send pid:%d , val:%d\n", getpid(),
info->si_pid,info->si_value.sival_int);
}
int main(int argc , char ** argv , char ** env)
{
struct sigaction act,oact;
sigemptyset(&act.sa_mask);
act.sa_flags =SA_SIGINFO;
act.sa_sigaction = sig_handler;
//act.sa_mask 用于屏蔽信号,当 sig_handler 被处理时
sigaction(SIGUSR2,&act,&oact);
pid_t pid = getpid();
printf("parent : %d\n", pid);
if(fork() == 0){
//子进程继承父进程 sigaction
union sigval v = {0};
v.sival_int = 1000;
pid_t pid = getpid();
printf("child pid:%d sending sig\n", pid);
sigqueue(getppid(),SIGUSR2,v);
raise(SIGUSR2);
for(int i = 0; i < 3; ++i){
sleep(1);
write(1,"b",1);
}
exit(0);
}
while(1){
write(1,".",1);
sleep(1);
}
return 0;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141368.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...