你好,游客 登录 注册 搜索
背景:
阅读新闻

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

[日期:2017-06-18] 来源:Linux社区  作者:jasmine-Jobs [字体: ]

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

举例说明:

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

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-06/144909.htm

linux
相关资讯       进程通信中进行值传递 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款