精华内容
下载资源
问答
  • Linux进程间通信方式

    2021-01-14 16:26:38
    二、Linux进程间通信方式简介 ​​​​​​​ 前言 进程间的通信就是在不同进程之间传播或者交换信息。进程的用户空间是相互独显然可以体用这几样的立的,一般而言是不能互相访问的,唯一的例外是共享空间。但是...

    目录

     

    前言

    一、进程间通信的目的

    二、Linux进程间通信方式简介


     


    前言

    进程间的通信就是在不同进程之间传播或者交换信息。进程的用户空间是相互独显然可以体用这几样的立的,一般而言是不能互相访问的,唯一的例外是共享空间。但是系统空间却是“公共场所”,所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其他数据库中的某些表项和记录交换信息。在广义上,这也是进程间通信的手段,到那时一般不把这算作进程间通信。

    一、进程间通信的目的

    (1)数据传输:一个进程需要将它的数据发送给另外一个进程,发送的数据量在一个字节到几兆字节之间。

    (2)共享数据:多个进程想要操作共享数据,若一个进程对共享数据进行修改,别的进程可以立刻看到

    (3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它发生了某件事件(在进程中止时要通知父进程)

    (4)资源共享:多个进程之间需要共享同样的资源。为了做到这一点,需要内核提供锁和同步机制

    (5)进程控制:有些进程希望完全控制另一个进程的执行(例如Debug进程),此时进程控制希望能够拦截另一个进程的所有信息和异常,并能够及时知道它的状态。

    二、Linux进程间通信方式简介

    在Linux下进程间通信的几种主要方式如下:

    • 管道(Pipe)和有名管道(FIFO)
    • 信号(Signal)
    • 消息队列
    • 共享内存(Shared Memory)
    • 信号量(Semaphore)
    • 套接字(Socket)

    (1)管道和有名管道。管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

    (2)信号(Signal)。信号是比较复杂的通信方式,用于通知接收进程有某种时间发生,除了用于进程间通信外,进程还可以发送信号给进程本身,Linux除了支持UNIX早期信号语义函数signal外,还支持语义符合Posix1,标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制的同时又能够同一对外接口,用sigaction函数重新实现了signal函数)

    信号是在软件层次上对中断机制的一种模拟,是一种一步通信方式

    信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件,他可以在任何时候发给某一进程,而无需知道该进程的状态。

    如果该进程当前并未处于执行形态,则该信号就由内核保存起来,知道该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才传递给进程

    (3)消息队列 消息队列是消息的链接表,包括Posix消息队列和System V消息队列。有足够权限的进程可以向队列中添加小夏,被赋予读权限的进程可以读走队列中的消息,消息队列克服了信号承载信息量少、管道智能承载无格式字节流,以及缓冲区大小受限等缺点。

    (4)信号量(Semaphore)/信号灯。信号量主要被用作进程间或统一进程不同线程之间的同步手段,信号量是用来解决进程之间的同步互斥问题的一种进程之间的通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作(PV操作)。由于信号量对应于某一种资源,去一个非负的整数值。信号量的值是指当前可用的资源数量,若它等于0则意味着目前没有可以用的资源。

    (5)共享内存(Shared Memory)共享内存可以说是最有用的进程间通信方式,也是最快的PC形式,两个不同进程AB共享内存的意思是,同一块物理内存被映射到进程A和进程B各自的进程地址空间内,进程A可以及时看到进程B对共享内中数据的更新,反之亦然。由于多个进程共享同一块内存地址,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的复制。

    (6)套接字(Socket)套接字是更为一般的进程间通信机制,可用于不同机器之间的进程间通信

     

     

    展开全文
  • 一、进程间通讯的方式 进程间通讯的方式有很多,常用的有共享内存(内存映射文件、共享内存DLL、剪切板等)、命名管道和匿名管道、发送消息等几种方法来直接完成,另外还可以通过socket口、配置文件和注册表等来...

    一、进程间通讯的方式

    进程间通讯的方式有很多,常用的有共享内存(内存映射文件、共享内存DLL、剪切板等)、命名管道和匿名管道、发送消息等几种方法来直接完成,另外还可以通过socket口、配置文件和注册表等来间接实现进程间数据通讯任务。以上这几种方法各有优缺点,具体到在进程间进行大数据量数据的快速交换问题上,则可以排除使用配置文件和注册表的方法;另外,由于管道和socket套接字的使用需要有网卡的支持,因此也可以不予考虑。这样,可供选择的通讯方式只剩下共享内存和发送消息两种。

    二、发送消息实现进程间通讯前准备

    下面的例子用到一个windows api 32函数

    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    private static extern int SendMessage(IntPtr wnd,int msg,IntPtr wP,IntPtr lP);

    要有此函数,需要添加using System.Runtime.InteropServices;命名空间

    此方法各个参数表示的意义

    wnd:接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

    msg:指定被发送的消息类型。

    wP:消息内容。

    lP:指定附加的消息指定信息。

    用api参考手册查看SendMessage用法时,参考手册则提示

    SendMessage与PostMessage之间的区别SendMessage和PostMessage,这两个函数虽然功能非常相似,都是负责向指定的窗口发送消息,

    SendMessage() 函数发出消息后一直等到接收方的消息响应函数处理完之后才能返回,并能够得到返回值,在此期间发送方程序将被阻塞,SendMessage() 后面的语句不能被继续执行,即是说此方法是同步的。

    PostMessage() 函数在发出消息后马上返回,其后语句能够被立即执行,但是无法获取接收方的消息处理返回值,即是说此方法是异步的。

     

    三、发送消息实现进程间通讯具体步骤

    1.新建windows应用程序

    (1)打开VS2008,新建一个“windows 应用程序”,主窗口为Form1,项目名称:ProcessCommunication
    (2)在Form1上添加一个标签为textBox1的文本框,并为Form1添加KeyDown事件,当Form1接收到KewDown消息时,将接收到的数据显示在label1上。

    public Form1()
    {
    InitializeComponent();

    this.KeyDown+=new KeyEventHandler(Form1_KeyDown);

    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
    this.textBox1.Text = Convert.ToString(e.KeyValue);
    }
    (3)编译运行,生成ProcessCommunication.exe

     

    2.新建windows应用程序

     

    (1)打开VS2008,新建一个“windows 应用程序”,主窗口为Form1,项目名称:ProcessCommunication1,
    并在Form1上添加一个按钮和一个文本框

    namespace ProcessCommunication1
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }
    //Win32 API函数:
    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    private static extern int SendMessage(IntPtr wnd,int msg,IntPtr wP,IntPtr lP);

    private void button1_Click(object sender, EventArgs e)
    {
    Process[] pros = Process.GetProcesses(); //获取本机所有进程
    for (int i = 0; i < pros.Length; i++)
    {
    if (pros[i].ProcessName == "ProcessCommunication") //名称为ProcessCommunication的进程

    {
    IntPtr hWnd = pros[i].MainWindowHandle; //获取ProcessCommunication.exe主窗口句柄
    int data = Convert.ToInt32(this.textBox1.Text); //获取文本框数据
    SendMessage(hWnd, 0x0100, (IntPtr)data, (IntPtr)0); //点击该按钮,以文本框数据为参数,向Form1发送WM_KEYDOWN消息
    }

    }

    }
    }

    3.启动ProcessCommunication.exe可执行文件,弹出Form1窗体称为接受消息窗体。

    启动ProcessCommunication1.exe可执行文件,在弹出的窗体中的文本框中输入任意数字,点击button1按钮,接受消息窗体textBox1即显示该数字。

    到此结束。

    //*************************

     

    C#使用SendMessage实现进程间通信的方法

    本文实例讲述了C#使用SendMessage实现进程间通信的方法。分享给大家供大家参考。具体分析如下:

    为了深入理解消息机制,先来做一个测试项目

    在新建项目的Form1的代码中,加入方法:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    protected override void DefWndProc(ref Message m)

    {

      if (m.Msg == 0x200)

      {

       MessageBox.Show("捕捉到消息");

      }

      else

      {

      }

      base.DefWndProc(ref m);

    }

    此方法重写了窗体的消息截获代码,运行后会发现,鼠标一移向窗体就会弹窗

    对于一个可视控件来说,是不断的在接受系统发送的消息的。比如鼠标悬停在某某控件上,就是一个消息,移出这个控件又是一个消息。如示例所示,其实鼠标移入窗体,窗体就获得了一个消息,无论你写没写过代码,它都获得了这个消息,一个消息对应触发一个事件,编写了事件代码,就会执行相应的代码操作。

    事件里编写的代码,和方法里写的代码,最主要的不同就在于前者是不知道何时触发,而后者是自己调用运行到那里就执行的。

    那谁来决定某个事件何时触发呢?那就是消息

    示例中的0x200是一个消息类型,代表了鼠标移入窗体这个消息

    现在讨论一下如何利用这种消息机制来在进程之间传递值

    需求:

    程序A的主窗体里有一个全局变量

    程序B的主窗体里有一个按钮,点击这个按钮,获取到程序A的这个变量

    实现:

    1. 新建一个解决方案,是程序A,窗体后台代码重写DefWndProc

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    public partial class Form1 : Form

    {

      public Form1()

      {

       InitializeComponent();

      }

      private void Form1_Load(object sender, EventArgs e)

      {

      }

      protected override void DefWndProc(ref Message m)

      {

       if (m.Msg == 0x104)

       {

        m.Result = (IntPtr)333;

        return;

           }

       else

       {    

       }

       base.DefWndProc(ref m);

      }

    }

    2. 新建一个解决方案,程序B,

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    public Form1()

    {

     InitializeComponent();

    }

    [DllImport("User32.dll", EntryPoint = "SendMessage")]

    private static extern IntPtr SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

     

    private void button2_Click(object sender, EventArgs e)

    {

     Process[] arrPro = Process.GetProcessesByName("WindowsFormsApplication1.vshost");

     IntPtr ip = SendMessage(arrPro[0].MainWindowHandle, 0x104, 1, 2);

    }

    这样,在按钮点击的时候,会向A发送一个消息,消息类型是104,两个参数1和2,A能捕获到,设置结果为333,那最后在B中的ip的值就是333

    展开全文
  • 进程间通信方式

    2021-09-15 17:24:21
    所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。 匿名管道通信 匿名管道( pipe ):管道是...

    进程通信:
    每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

    匿名管道通信

    匿名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系

    // 需要的头文件
    #include <unistd.h>
    
    // 通过pipe()函数来创建匿名管道
    // 返回值:成功返回0,失败返回-1
    // fd参数返回两个文件描述符
    // fd[0]指向管道的读端,fd[1]指向管道的写端
    // fd[1]的输出是fd[0]的输入。
    int pipe (int fd[2]);
    

    通过匿名管道实现进程间通信的步骤如下:

    • 父进程创建管道,得到两个⽂件描述符指向管道的两端
    • 父进程fork出子进程,⼦进程也有两个⽂件描述符指向同⼀管道。
    • 父进程关闭fd[0],子进程关闭fd[1],即⽗进程关闭管道读端,⼦进程关闭管道写端(因为管道只支持单向通信)。⽗进程可以往管道⾥写,⼦进程可以从管道⾥读,管道是⽤环形队列实现的,数据从写端流⼊从读端流出,这样就实现了进程间通信。

    高级管道通信

    高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。

    有名管道通信

    有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

    消息队列通信

    消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

    信号

    信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

    共享内存通信

    共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

    套接字通信

    套接字( socket ) : 套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

    1. 命名socket
    2. 绑定

    3. 监听

    4. 连接服务器

    5. 相互发送接收数据

    6. 断开连接

    展开全文
  • Java进程间通信方式

    2021-03-06 05:41:29
    进程间通信又称IPC(Inter-Process Communication),指多个进程之间相互通信,交换信息的方法。根据进程通信时信息量大小的不同,可以将进程通信划分为两大类型:1、低级通信,控制信息的通信(主要用于进程之间的同步...

    进程间通信又称IPC(Inter-Process Communication),指多个进程之间相互通信,交换信息的方法。

    根据进程通信时信息量大小的不同,可以将进程通信划分为两大类型:

    1、低级通信,控制信息的通信(主要用于进程之间的同步,互斥,终止和挂起等等控制信息的传递) 。

    2、高级通信,大批数据信息的通信(主要用于进程间数据块数据的交换和共享,常见的高级通信有管道,消息队列,共享内存等)。

    进程间的通信方式有管道,有名管道,信号量,消息队列,信号,共享内存,套接字等一些通信方式。

    管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

    有名管道 named pipe: 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

    信号量( semophore ): 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。不是用于交换大批数据,而用于多线程之间的同步.常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源。

    因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

    消息队列( message queue : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

    信号 ( signal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

    通常在linux系统中,我们使用kill命令来杀死进程的时候,都是通过信号来实现的,如果将被杀死的程序实现了对KILL信号的处理,那么该程序将会自动调用自身的销毁代码来执行线程或者进程的销毁操作;如果没有实现KILL信号的接收,则由系统进行强制关闭该线程或进程。

    共享内存( shared memory ):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。

    它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

    套接字( socket ): 套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

    展开全文
  • 进程间通信方式

    2021-04-22 07:42:33
    1.管道管道,通常指无名管道,是 UNIX 系统IPC最古老的...概念:在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,没有血缘关系的进程也可以进程间通信。3.特点:1.面向字节流,2.生命周期随内核3.自带...
  • 一、进程间通信(IPC,Inter-Process Communication)是指在不同进程间传播或交换信息 1. 无名管道 特点 半双工(数据流向仅有一个方向),具有固定的读端和写端 只能用于父进程或兄弟线程之间通信(具有血缘关系的...
  • 1文件映射文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。Win32 API允许多个进程访问同一文件...
  • 目录 1 管道 2 信号 3 信号量 4 消息队列 5 共享内存 ...7 各通信方式的优缺点 ... 进程间的通信主要有管道,信号,信号量,共享内存,消息队列...匿名管道是单向的,只能在有亲缘关系的进程间通信; 命名管道以磁盘...
  • 本文关键字: linux 管道通信,linux 进程通信方式,无名管道,有名管道管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入。Linux的管道主要包括两种:无名管道和有名管道。无名...
  • 进程间通信的六种常见方式

    千次阅读 2021-06-01 13:52:45
    进程间通信方式有很多,这里主要讲到进程间通信的五种方式,分别为:管道、FIFO、消息队列、共享内存、信号量。 一、管道 管道的特点: df
  • 早期的进程间通信方式: 无名管道、有名管道、信号通信 SYSEM V: (IPC对象) 消息队列、共享内存、信号灯集 BSD: 套接字通信 共享内存是所有进程间通信方式中效率最高的,因为它直接操作物理内存 信号通信是进程间...
  • 进程间通信一级目录二级目录三级目录 一级目录 二级目录 三级目录
  • Linux下进程间通信方式主要包括:信号,管道,信号量,消息队列,共享内存,socket 信号: 是一种事件通知机制,或者说是一种事件中断机制,通过信号通知当前进程发生了什么事件,中断进程当前操作去执行另外一...
  • 当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这是最快的一种IPC。 注:共享内存没有任何的同步与...
  • 进程间通信方式一:管道2.进程间通信方式二:共享内存3.进程间通信方式三:消息队列4.进程间通信方式四:信号量 1.进程间通信(IPC) 1.进程间通信方式:管道、共享内存、消息队列、信号量、套接字(后面会详细介绍) ...
  • 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所...
  • 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所...
  • linux 进程间通信方式

    2021-01-15 15:03:49
    1. 用户态和内核态进程通信 1)系统调用,最常用, 比如针对IO,有linux同步io接口(libaio最终也是调用linux同步io系统接口),linux aio ,linux io_uring 2)procfs 进程文件系统,伪文件系统,不占外部空间,...
  • 一、内核 1. 概念 计算机由各种外部硬件设备组成,如内存,cpu...管理硬件设备,为进程和硬件设备之间提供通信能力,即硬件通信能力 提供系统调用,如果应用程序要运行更高权限运行的服务,就需要有系统调用,它是用户
  • 进程间通信概述 Linux内核通信相关视频讲解:Linux内核,进程间通信组件的实现 linux内核,进程调度器的实现,内核源码分析 进程通信的目的 传输数据 一个进程须要将它的数据发送给还有一个进程。发送的数据...
  • 几种进程间通信方式 比较

    千次阅读 2020-12-22 18:34:54
    # 管道( pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe) :有名管道也是半双工的通信方式,但是它允许...
  • 首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待...
  • 1、线程通信方式使用全局变量主要由于多个线程可能更改全局变量,因此全局变量最好声明为volatile使用消息实现通信在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息队列和消息循环...
  • 进程间通信 引言 在操作系统中,一个进程可以理解为是关于计算机资源集合的一次运行活动,其就是一个正在执行的程序的实例。从概念上来说,一个进程拥有它自己的虚拟CPU和虚拟地址空间,任何一个进程对于彼此而言都...
  • 1.常见的通信方式 2.按通信类型区分 3、详解 3.1 管道 3.2 无名管道 3.3 命名管道 3.4 消息队列 3.5 共享内存 3.6 信号量 1.常见的通信方式 管道的实质是一个内核缓冲区,进程以先进先出的方式从缓冲区...
  • 原标题:Linux系统编程之进程间通信方式:命名管道一命名管道的概述无名管道,由于没有名字,只能用于亲缘关系的进程间通信(更多详情,请看《无名管道》)。为了克服这个缺点,提出了命名管道(FIFO),也叫有名管道、...
  • 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间...
  • 这次带给你的面试题目是:进程间通信都有哪些方法? 凡是面试官问“什么情况下”的时候,面试官实际想听的是你经过理解,整理得到的认知。回答应该是概括的、简要的。而不是真的去列举每一种 case。另外,面试官...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 235,434
精华内容 94,173
关键字:

进程间通信的方式