Linux系统编程:习题,父子进程通过信号通信,实现交替数数
生活随笔
收集整理的這篇文章主要介紹了
Linux系统编程:习题,父子进程通过信号通信,实现交替数数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Linux練習題,父子進程通過信號通信,實現交替數數。
習題思路
父子進程交替發信號進行驅動從而實現數數,值得注意的是 不管是父進程或者子進程誰先發送信號 都會面臨一個問題,另外一個進程的信號捕捉函數是否已經注冊了!所以有2種方式,一種是 最先發送信號的進程先 sleep一下等另外一個進程的信號捕捉函數注冊完畢了 就可以發送信號進行相互驅動。第二種方式,采用阻塞信號集的方式,在后數數的進程注冊信號捕捉函數前 將其信號進行阻塞,待其信號捕捉函數注冊完畢 然后再解除阻塞。
習題代碼
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <error.h> #include <sys/errno.h> #include <signal.h> #include <sys/time.h>void perr(const char* str) {perror(str);exit(1); } int num = 0; int num1 = 1; pid_t son_pid; void father_num(int signo) {printf("father\tnum = %d\n",num1);num1+=2;sleep(1);kill(son_pid,SIGUSR2); } void son_num(int signo) {printf("son\tnum = %d\n",num);num+=2;sleep(1);kill(getppid(),SIGUSR1); }//父子進程通過信號通信,實現交替數數 //使用用戶定義的信號,在父子進程間進行信號通信 //兒子先數數 int main(int argc,char* argv[]) {pid_t pid;int ret;struct sigaction act1,act2;sigset_t set;//設置信號阻塞一定是在fork前,這樣才能保證,發送給子進程的SIGUSR2信號被阻塞sigemptyset(&set);sigaddset(&set,SIGUSR2);sigprocmask(SIG_BLOCK,&set,NULL);pid = fork();son_pid = pid ;if(pid > 0){//讓兒子將信號捕捉函數先注冊,再才給子進程發信號//可以先讓父親睡一會,或者將發送給子進程的信號阻塞 等待子進程注冊完畢再解除阻塞//這樣的話,父進程和子進程相互發的信號就不能一樣,不然會搞混//sleep(1);//父進程act1.sa_flags = 0;sigemptyset(&act1.sa_mask);act1.sa_handler = father_num;//注冊捕捉信號函數 sigaction(SIGUSR1,&act1,NULL);kill(pid,SIGUSR2);while(1);}else if ( pid == 0 ){//子進程act2.sa_flags = 0;sigemptyset(&act2.sa_mask);act2.sa_handler = son_num;//注冊捕捉信號函數 ret = sigaction(SIGUSR2,&act2,NULL);//子進程注冊完信號捕捉函數 就可以解除對子進程的信號阻塞了sigprocmask(SIG_UNBLOCK,&set,NULL);if(ret < 0){perr("sigaction error");}while(1);}else {//errorperr("fork error");}return 0; }運行效果
總結
以上是生活随笔為你收集整理的Linux系统编程:习题,父子进程通过信号通信,实现交替数数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++: OpenSSL实现http
- 下一篇: 九种排序方法辨析