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

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

举例说明:

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

时间: 2024-09-30 12:14:45

进程通信中如何进行值得传递?的相关文章

Android基础——Messenger在跨进程通信中的使用

Messenger在跨进程通信中的使用 事先说明: 本人也是个初学者,所以本文是从初学者的角度入手,如果有不妥的地方请留言教导我,谢谢. 本篇文章主要针对讲解Messenger的使用和Messenger在应用层上的原理解析和Messenger在服务端的回复. 什么是Messenger? Messenger可以翻译为信使,Messenger是一种轻量级的IPC方案,通过它可以在不同进程中传递Message对象,在Message中放入我们需要传递的数据,就可以实现数据的进程间传递了. 步骤一:Mes

unity3d进程通信利用WM_COPYDATE和HOOK

hello,近期用unity做了进程通信,应该是和c++的PC端实现通信,才開始一头雾水,后来实现了才知道好繁杂......先感谢对我提供帮助的百度,谷歌以及游戏圈的大大们. 在进程通信中非常多方法,可是wm_copydate绝对要比别的什么内存共享好了很多. unity大部分用c#语言,c#本身Forms这个dll里面也提供了对windows消息的接收可是在unity中无法非常好地使用System.Windows.Forms,所以在以下我的代码我用unity发送进程消息的是 user32.dl

进程通信,线程通信,同步方式

一.进程间通信 进程间的通信,它的数据空间的独立性决定了它的通信相对比较复杂,需要通过操作系统.以前进程间的通信只能是单机版的,现在操作系统都继承了基于套接字(socket)的进程间的通信机制.这样进程间的通信就不局限于单台计算机了,实现了网络通信.进程的通信机制主要有:管道.有名管道.消息队列.信号量.共享空间.信号.套接字. 1.信号 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号

【朝花夕拾】一篇文章搞懂Android跨进程通信

前言 只要是面试中高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Android开发高级工程师必须要跨过的一道坎.如果您还对这方面的知识还做不到如数家珍,那就和我一起来攻克它吧! 本文主要包含了如下内容: 其行文脉络大致如下,希望能加深读者对这方面内容的记忆:(1)Android基于Linux系统,所以先说系统进程相关知识和Linux IPC.(2)总结Android的IPC

Linux进程通信----匿名管道

Linux进程通信中最为简单的方式是匿名管道 匿名管道的创建需要用到pipe函数,pipe函数参数为一个数组 表示的文件描述字.这个数组有两个文件描述字,第一个是用 于读数据的文件描述符第二个是用于写数据的文件描述符. 不能将用于写的文件描述符进行读操作或者进行读的文件描述 符进写操作,这样都会导致错误. 关于匿名管道的几点说明: 1.匿名管道是半双工的,即一个进程只能读,一个进程只能写    要实现全双工,需要两个匿名管道. 2.只能在父子进程或者兄弟进程进行通信. 3.在读的时候关闭写文件描

c++ pipe实现父子进程通信

1.父子进程通信pipe编程流程 -创建管道 -设置进程的输出到管道 -创建进程 -关闭管道写句柄 -读管道读句柄,把数据读到一个buffer里 2.注意事项 -读管道数据的时候,一定要关闭写句柄: -父子进程通信时,句柄的传递多通过继承来完成,父进程允许这些句柄为子进程继承:创建子进程,是否继承的属性要设置为true: // pdfprintconsole.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include "pch.h&quo

C#中使用SendMessage进行进程通信的实例

原文:C#中使用SendMessage进行进程通信的实例 1 新建解决方案SendMessageSecondExample 在解决方案下面新建两个项目:Sender和Receiver,两者的输出类型均为"Windows 应用程序".整个程序的结构如下图所示. 2 实现项目Sender Sender仅包含一个名为"消息发送者"的窗体,如下图所示. 编写窗体后端代码,如下所示. using System; using System.Diagnostics; using

C#中使用命名管道进行进程通信的实例

原文:C#中使用命名管道进行进程通信的实例 1 新建解决方案NamedPipeExample 在解决方案下面新建两个项目:Client和Server,两者的输出类型均为"Windows 应用程序".整个程序的结构如下图所示. 2 实现项目Client Client仅包含一个名为"客户端"的窗体,如下图所示. 编写窗体后端代码,如下所示. using System; using System.IO; using System.IO.Pipes; using Syste

Android中跨进程通信传递Parcelable对象时出现android.os.BadParcelableException: ClassNotFoundException when unmarsh

转载请注明出处:http://blog.csdn.net/bettarwang/article/details/45315091 按Google开发文档的说法,在跨进程通信时,推荐使用MessengerService而不是AIDL,所以最近在实现一个跨进程的Service时就采用了MessengerService的方法. 然后定义了这样一个类: public class BleServiceBean implements Parcelable { private String name; pri