创建一个子进程,
子进程间隔7s发送2个信号给父进程,
父进程注册2个信号响应函数,
创建一个信号集,将所有信号添加到信号集,
判断2个信号是否在信号集中,将信号集中的信号设置为阻塞,
延时10s解除1个信号的阻塞,
在5s后解除另一个信号的阻塞,
信号响应函数 打印进程pid与信号值
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
void func1(int sig)
{
printf("pid=%d,收到%d信号, 执行响应函数1\n",getpid(),sig);
}
void func2(int sig)
{
printf("pid=%d,收到%d信号, 执行响应函数2\n",getpid(),sig);
}
int main(int argc, char const *argv[])
{
pid_t pid=fork();
if (pid > 0)
{
printf("父进程pid=%d\n",getpid());
signal(10, func1);
signal(12, func2);
sigset_t myset;
sigaddset(&myset,10);
sigaddset(&myset,12);
if (sigismember(&myset, 10))
{
printf("10信号在myset信号集中\n");
}
else
{
printf("10信号不在myset信号集中\n");
}
if (sigismember(&myset, 12))
{
printf("12信号在myset信号集中\n");
}
else
{
printf("12信号不在myset信号集中\n");
}
sigprocmask(SIG_BLOCK, &myset, NULL);
sigprocmask(SIG_UNBLOCK, &myset, NULL);
sigemptyset(&myset);
int a=10;
while(a--)
{
sleep(1);
printf("父进程 %d 信号10\n", a);
sigaddset(&myset,10);
sigprocmask(SIG_UNBLOCK, &myset, NULL);
}
sigemptyset(&myset);
a=5;
while(a--)
{
sleep(1);
printf("父进程 %d 信号12\n", a);
sigaddset(&myset,12);
sigprocmask(SIG_UNBLOCK, &myset, NULL);
}
}
else if (pid == 0)
{
int a=7;
while(a--)
{
sleep(1);
printf("子进程 %d 信号10\n", a);
}
kill(getppid(), 10);
a=7;
while(a--)
{
sleep(1);
printf("子进程 %d 信号12\n", a);
}
kill(getppid(), 12);
}
return 0;
}