进程间通讯的基础知识

来源:互联网 发布:中国淘宝第一村 编辑:程序博客网 时间:2024/06/14 22:19

进程间通讯的基础知识

    复杂的编程环境通常使用多个相关的进程来执行有关操作。进程之间必须进行通讯,来共享资源和信息。因此,要求内核提供必要的机制,这些机制通常称为进程间通信。

一, 进程间通讯的目的

1) 数据传输。进程可能要发送数据到另一个进程。发送的数据量可以在一个字节到几兆字节之间。

2) 共享数据。多个进程想要操作共享的数据。一个进程修改数据,其他共享该数据的进程应该立即看到这个变化。

3) 通知事件。当一些事情发生时,进程也许会向另一个进程或一组进程发消息通知事件的发生。例如,进程终止时,她要通知他的父进程。接收者可能是被异步通知的,这时它的正常会被中断。由此,接收者可以选择等待接收通知。

4) 资源共享。一些要求相互操作的进程需要自行定义一些协议,这些协议针对它们要访问的特定的资源。这些协议是通过锁和同步机制来实现的,而锁和同步机制是建立在内核提供的基本功能之上的。

5) 进程控制。有些进程,例如,debugger希望完全控制一个进程(目标进程)的执行。控制进程希望能够拦截为目标进程设计的所有的陷入和异常,并且能够及时知道目标进程的状态改变。


二, 进程间通讯机制

    进程间的通讯机制,就是多个进程之间相互通讯、交换信息的方法。linux支持多种IPC机制。信号与管道是其中的两个,linux还支持传统的UNIX System V的IPC机制。

1) 信号。

    信号主要用来通知进程异步事件的发生。

    a) 注册信号调用函数。

        要对一个信号进行处理,就需要给出信号发生时系统所调用的处理函数。可以为特定的信号注册相应的处理函数。除了无法捕捉的SGKIL和SIGSTOP函数。注册的信号处理函数所采用的系统调用如下:

       #include <signal.h>

        void (*signal(int signumber, void ((*func)(int)))(int));


    b) 高级信号处理

        Linux系统还提供另一功能更强的系统调用sigaction:

        #include <signal.h>

       int sigaction(int signumber, const struct sigaction *act, struct sigaction *oldact);

       函数sigaction不但可以实现函数signal的功能,而且还可以提供更加详细的信息,确切了解进程接收到信号时所发生的具体细节。它可以完全代替函数signal的功能。


      c) 信号集

            一个用户的进程需要对多个信号做出处理。为了方便对多个信号进行处理,在linux中引入了信号集的概念。



2) 管道。

    传统实现中,管道是单向的,先入先出的,无结构的,固定大小的数据流。写进程是在管道的尾端写入数据,读进程是从管道的首端读出数据。数据读出之后,将从管道移走,其他读进程都不能在读到这些数据。

3) System V IPC 机制简介

    linux支持UNIX System V中的三种进程间通讯机制,它们是消息队列,信号量和共享内存。这几个System V IPC机制有一个共同点,就是使用相同的认证方法,一个进程只有通过调用想额你和传递一个唯一的引用标识符才能访问这些资源。

    a) 消息队列。消息队列就是消息链表的头部指针。消息队列允许一个或多个进程写消息,同样这个消息可以被一个或多个进程读取。

    b) 信号量。信号量是为了控制进程对资源的使用而发明的。信号量是具有整数值的对象,他的工作原理是,它支持两种原子操作P和V,P操作减少信号量的值,如果某个信号量的值小于0,则操作阻塞;V操作增加信号量的值,如果结果值大于或等于0,V操作就要唤醒一个等待进程。这两个操作是原子的,即他们是最小操作,是不可分割的。

    c) 共享内存。共享内存区域是被多个进程共享的一部分物理内存。进程可以把这些区域映射到他们地址空间中的任一合适的虚拟地址范围。这些地址范围对每一个进程来说可以是不同的。映射后,这些区域就可以像其他任何内存地址那样被访问,而不需要对他使用读或写调用。一次共享内存机制提供了进程共享数据的最快方法。进程想共享内存区域写入数据,那么共享这个区域的所有进程可以立即看见共享区域中新的内容。

       


原创粉丝点击