zoukankan      html  css  js  c++  java
  • 进程通信中如何进行值得传递?

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

    举例说明:

    #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 ");
      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 ",getpid());
          LoopVal = 7;
          ExitCode = 24;
          key_t  key = ftok(".",100);
        if(key ==-1)
       {
          printf("出错了 ");
          return -1;
       }
       int id = shmget(key,4,IPC_CREAT|IPC_EXCL|0666);
       printf("id = %d ",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........ ";
          printf("pareentid=%d ",getpid());
          LoopVal = 5;
          ExitCode = 15;
          key_t key1 = ftok(".",100); //父进程指向子进程共享的那块内存。
        int shmid1 = shmget(key1,0,0);
        printf("shmid = %d ",shmid1);
        void *p1 = shmat(shmid1, 0, 0);//获取到子进程中修改后的全局变量的地址。
        int *pi1 = p1;
        printf("*pi1=%d ",*pi1);//打印子进程中修改后的值。
        shmdt(p1);
          break;
        }
         printf("LoopVal=%d ",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 ",ChildPid);
          if(WIFEXITED(StateVal))             //如果子进程正常结束,它就取一个非零值
       {  //说明:WEXITSTATUS刚好和WIFEXITED相反,当子进程正常结束,它就取一个零值,非正常结束,取一个非零值。
         printf("the child processxx has exit with code %d ",WEXITSTATUS(StateVal));

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

  • 相关阅读:
    Android 查看APK文件的签名算法
    Android 查看App冷启动时间/热启动时间/页面打开时间
    Android 查看Apk签名方式V1和V2
    Android App启动速度优化
    Android SharedPreferences中apply和commit的效率差距
    Gralde 网络代理
    Git 将子文件夹分离为一个新的库
    Fabric-Crashlytics-Android 注意点
    Gradle编译失败 generating the main dex list
    Gralde 同步失败
  • 原文地址:https://www.cnblogs.com/jasmine-Jobs/p/4425180.html
Copyright © 2011-2022 走看看