fork - 利用信号在父子进程间传递指针的实验

接上篇文章,父子进程间可以传递数据,那么能传递指针吗?我们来试试:

 
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



从结果可以看到指针可以传递过去,但是指针所指的值变化了,为什么呢?答案很简单,在进程那部分,我们一直在强调一点:父子进程的地址空间是相互独立的!所以在父子进程间传递指针是没有意义的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值