接上篇文章,父子进程间可以传递数据,那么能传递指针吗?我们来试试:
运行结果:
从结果可以看到指针可以传递过去,但是指针所指的值变化了,为什么呢?答案很简单,在进程那部分,我们一直在强调一点:父子进程的地址空间是相互独立的!所以在父子进程间传递指针是没有意义的。
1 #include<stdio.h>
2 #include<sys/types.h>
3 #include<unistd.h>
4 #include<stdlib.h>
5 #include<signal.h>
6 #include <sys/types.h>
7 #include <sys/wait.h>
8 void handler_sigint(int signo,siginfo_t *siginfo,void*pvoid)
9 {
10 int *a;
11 a=(int*)(siginfo->si_ptr);
12 printf("recv SIGINT,the pointer data is %d\n",*a);
13 }
14 int main(int argc,char*argv[])
15 {
16 pid_t pid;
17 switch(pid=fork())
18 {
19 case -1:
20 printf("fork error\n");
21 break;
22 case 0:
23 {
24 printf("child process is running\n");
25 struct sigaction act;
26 act.sa_sigaction=handler_sigint;
27 act.sa_flags=SA_SIGINFO;
28 sigaction(SIGINT,&act,NULL);
29 pause();
30 break;
31 }
32 default:
33 { union sigval value;
34 int signum=SIGINT;
35 int i,stat;
36 value.sival_ptr=&signum;
37 printf("parent process is running\n");
38 int *a;
39 a=(int *)value.sival_ptr;
40 printf("In the father process,the pointer data is %d\n",*a);
41 if(argc!=1&&argc!=3&&argc!=5)
42 {
43 printf("./send_pointer\n");
44 exit(1);
45 }
46 for(i=1;i<argc;i++)
47 {
48 if(!strcmp(argv[i],"-s"))
49 {
50 signum=atoi(argv[i+1]);
51 continue;
52 }
53 }
54 sleep(5);
55 if(sigqueue(pid,signum,value) < 0)
56 {
57 perror("sigqueue");
58 exit(1);
59 }
60 wait(&stat);
61 break;
62 }
63 }
64 return 0;
65 }
运行结果:
[wjl@wjl-desktop ~/c/signal 17:58:37 #86]$ ./send_pointer
parent process is running
In the father process,the pointer data is 2
child process is running
recv SIGINT,the pointer data is 9199808
从结果可以看到指针可以传递过去,但是指针所指的值变化了,为什么呢?答案很简单,在进程那部分,我们一直在强调一点:父子进程的地址空间是相互独立的!所以在父子进程间传递指针是没有意义的。