一个进程通信的问题

一、问题的描述如下:

父进程创建子进程1,然后创建子进程2,子进程1将自己的pid乘以2,用可靠信号发送给子进程2,子进程2收到之后,发送给父进程。

二、问题分析:

     首先,进程间发送数据可以用sigaction/sigqueue来完成;可靠信号是kill -l里面 32-64的那些。问题是,子进程1如何知道子进程2的pid?如果知道了,那么这个问题将迎刃而解。

三、问题解决。

      当父进程创建子进程1后,等待,创建子进程2后,父进程将进程2的pid发送给进程1,这样便可以不断的发送数据了。

      代码如下:(子进程会继承父进程注册的信号,所以父进程--子进程1,子进程1-子进程2,子进程2-父进程 的三次发送信号的处理函数都在一开始便进行了注册。)

      

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <errno.h>
 4 #include <fcntl.h>
 5 #include <unistd.h>
 6 #include <sys/stat.h>
 7 #include <sys/types.h>
 8 #include <sys/types.h>
 9 #include <signal.h>
10 #include <string.h>
11 #include <sys/wait.h>
12 // 要求是子进程1发送给2,但是1如何获得2到pid呢?
13 void handle(int num, siginfo_t * sigdata, void *p)
14 {
15     if(num == SIGRTMIN+1){
16         printf("recv data:%d from pid2\n",sigdata->si_value.sival_int);    
17     }
18     if(num == SIGRTMIN+2){
19         // 收到父进程发过来到信号,解析出pid2,然后把pid*2发送给pid2
20         printf("get pid2` from father %d\n",sigdata->si_value.sival_int);
21         union sigval senddata;
22         senddata.sival_int = getpid()*2;            
23         if(sigqueue(sigdata->si_value.sival_int,SIGRTMIN+3,senddata) == -1){
24             perror("error");
25         }                    
26     }
27     if(num == SIGRTMIN+3){
28         pid_t pid = getppid();
29            union sigval senddata;
30         senddata.sival_int = sigdata->si_value.sival_int;
31         printf("get data %d from pid1\n", senddata.sival_int);
32         if(sigqueue(pid,SIGRTMIN+1,senddata) == -1){
33             perror("error");
34         }
35     }
36 }
37 int main(void)
38 {
39     pid_t pidArray[10] = {0};
40     pid_t pid;
41     int i;
42     struct sigaction sigaf;
43     sigaf.sa_sigaction = handle;        
44     sigaf.sa_flags = SA_SIGINFO;
45     sigaction(SIGRTMIN+1,&sigaf,NULL);
46     
47     sigaction(SIGRTMIN+2,&sigaf,NULL);
48 
49     sigaction(SIGRTMIN+3,&sigaf,NULL);
50     for(i = 0; i < 2; ++i){
51         pidArray[i] = pid = fork();
52         if(pid == 0){
53             break; // 子进程不生子进程
54         }
55         else if(pid > 0){
56         }
57     }
58     if(pid > 0){ // 父进程
59         // 将pid2发送给pid1
60         while(pidArray[2] == 0){
61             
62         }
63         union sigval sendtoone;
64         sendtoone.sival_int = pidArray[1];
65         if(sigqueue(pidArray[0],SIGRTMIN+2,sendtoone) == -1){
66             perror("error");            
67         }
68         sleep(10);
69     }
70 
71     if(pid ==0 && i == 0){ // 子进程1
72         sleep(4);
73         exit(0);
74     }
75     if(pid == 0 && i == 1){ // 子进程2
76         sleep(4);
77         exit(0);
78     }
79     int mypid = 0;
80     while((mypid = waitpid(-1,NULL,WNOHANG)) > 0){
81         printf("%d 结束\n", mypid);
82     }
83     return 0;
84 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。