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

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

举例说明:

#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);
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b691d686a99c445ec36cffc44ebcb21a.html