招聘网站怎么做效果好,网站由哪些部分组成,wordpress改插件难吗,网站备案批量查询#x1f525;博客主页#xff1a; 我要成为C领域大神#x1f3a5;系列专栏#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享#xff0c;与更多的人进行学习交流
实现原理博客主页 我要成为C领域大神系列专栏【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞收藏⭐评论✍️ 本博客致力于知识分享与更多的人进行学习交流
实现原理通过 SIGUSR110 和 SIGUSR212 信号进行进程间通信。
父进程中屏蔽SIGUSR1然后将这个屏蔽集继承给子进程子进程被创建后默认屏蔽SIGUSR1而后子进程完成信号捕捉。捕捉设定完毕解除对SIGUSR1的屏蔽。这样可以避免子进程还未捕捉完成就被先抵达的信号杀死。
定义信号处理函数编写函数处理接收到的 SIGUSR1 和 SIGUSR2 信号。 struct sigaction 结构体用于绑定捕捉函数可以绑定的捕捉函数的原型取决于结构体中的sa_flags成员通过帮助手册可以看到三种函数原型。而sa_sigaction函数可以携带数据进行传递整型或者指针取决于sigqueue在传递数据时是整型还是指针 sigqueue 函数是一个用于向指定进程发送信号的函数并附带一个额外的整数或指针值。与标准的 kill 函数相比sigqueue 提供了一个更高级的接口可以携带附加数据从而实现更复杂的进程间通信。
在进程间传递信息使用sigqueue函数 #include signal.hint sigqueue(pid_t pid, int sig, const union sigval value); value: 一个 union sigval 联合体可以包含一个整数或一个指针值。用于传递附加数据。
union sigval 联合体 union sigval {int sival_int;void *sival_ptr;
}; 下面是利用这一机制实现使用信号进行进程间通信的demo程序 #include stdio.h
#include stdlib.h
#include unistd.h
#include fcntl.h
#include sys/types.h
#include string.h
#include sys/fcntl.h
#include signal.hpid_t childPid;
void Parent_SIG(int signo,siginfo_t *info,void *arg)
{//显示数据printf(Parent PID:%d val:%d\n,getpid(),info-si_int);union sigval val;val.sival_int(info-si_intsigqueue(childPid,SIGUSR1,val);usleep(500000);
}void Child_SIG(int signo,siginfo_t *info,void *arg)
{//显示数据printf(Child PID:%d val:%d\n,getpid(),info-si_int);union sigval val;val.sival_int(info-si_int);sigqueue(getppid(),SIGUSR2,val);usleep(500000);
}
int main()
{//设置父进程捕捉SIGUSR2信号struct sigaction act,oldact;act.sa_flagsSA_SIGINFO;act.sa_sigactionParent_SIG;sigemptyset(act.sa_mask);sigaction(SIGUSR2,act,oldact);//设置父进程屏蔽SIGUSR1信号并将屏蔽字继承给子进程sigset_t set,oldset;sigemptyset(set);sigaddset(set,SIGUSR1);sigprocmask(SIG_SETMASK,set,oldset);pid_t pidfork();if(pid0){//第一次发送信号union sigval val;val.sival_int1;childPidpid;sigqueue(childPid,SIGUSR1,val);while(1) sleep(1);//等待信号}else if(pid0){//设置捕捉信号struct sigaction act,oldact;act.sa_flagsSA_SIGINFO;act.sa_sigactionChild_SIG;sigemptyset(act.sa_mask);sigaction(SIGUSR1,act,oldact);//解除屏蔽sigprocmask(SIG_SETMASK,act.sa_mask,NULL);//等待信号while(1) sleep(1);}else{perror(fork call failed);}return 0;
} 运行结果