进程通信中如何进行值得传递?

子进程中修改了程序的某个全局变量的值,如何在其他子进程中或者父进程中取得修改后的值,除了连数据库之外,还可以通过共享内存来获取。

举例说明:

#include <sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include <sys/shm.h>
int main()
{
  pid_t pid;                                  //记录fork()的返回值,用于区别父子进程
  char *Message;                              //用于记录输出信息
  int LoopVal;      //用于记录父子进程的循环次数
  int LoopVal1;      //用于循环
  int ExitCode;
  int P1 = 100; //定义一个全局变量的初值。后面子进程中修改这个变量的值。
  printf("the new fork starting\n");
  pid=fork();                                        //新建子进程
  switch(pid)
    {
    case -1:      //建立进程错误      
     printf("creat new fork error!");
     exit(1);
    case 0:                                           //子进程
      Message = "This is in the child process";
      printf("childid=%d\n",getpid());
      LoopVal = 7;
      ExitCode = 24;
      key_t  key = ftok(".",100);
    if(key ==-1)
   {
      printf("出错了\n");
      return -1;
   }
   int id = shmget(key,4,IPC_CREAT|IPC_EXCL|0666);
   printf("id = %d\n",id);
   void *p = shmat (id,0,0);
    int *pi = p;
   *pi = P1+1 ;//子进程中对全局变量进行加1操作。父进程后续去取这个修改后的值。
   shmdt(p);
   exit(0);
    default:                                         //父进程
      Message = "This is in the parent process,waiting the child finished........\n";
      printf("pareentid=%d\n",getpid());
      LoopVal = 5;
      ExitCode = 15;
      key_t key1 = ftok(".",100); //父进程指向子进程共享的那块内存。
    int shmid1 = shmget(key1,0,0);
    printf("shmid = %d\n",shmid1);
    void *p1 = shmat(shmid1, 0, 0);//获取到子进程中修改后的全局变量的地址。
    int *pi1 = p1;
    printf("*pi1=%d\n",*pi1);//打印子进程中修改后的值。
    shmdt(p1);
      break;
    }
     printf("LoopVal=%d\n",LoopVal);
  for(LoopVal1=0;LoopVal1<LoopVal;LoopVal1++)
    {
      puts(Message);
      sleep(1);
    }
 
  if(pid!=0)         //父进程
    { 
     
      int StateVal;
     
      pid_t ChildPid;
      ChildPid = wait(&StateVal);         //用StateVal记录状态信息
      //
      printf("The child has finished with  the PID of %d\n",ChildPid);
      if(WIFEXITED(StateVal))             //如果子进程正常结束,它就取一个非零值
   {  //说明:WEXITSTATUS刚好和WIFEXITED相反,当子进程正常结束,它就取一个零值,非正常结束,取一个非零值。
     printf("the child processxx has exit with code %d\n",WEXITSTATUS(StateVal));

    }                                               //如果WIFEXITED非零,它返回子进程的退出码
      else
    printf("the child has terminated abnormally\n");
    }       
  printf("end--")  ;                                            //子进程非正常结束
  //exit(ExitCode);
}

posted on 2015-04-14 16:07  丰泽园的天空  阅读(215)  评论(0编辑  收藏  举报

导航