【嵌入式】Linux C编程——进程间通信方式

Linux的进程间通信方法有管道、消息队列、信号量、共享内存和嵌套字等。

1、进程间通信的目的

  • 数据传输:一个进程需要将它的数据发送给另一个进程。
  • 共享数据:多个进程想要操作共享数据,若一个进程对共享数据进行修改,别的进程可以立即看到。
  • 通知事件:一个进程需要向另一个或一组进程发消息,通知它们发生了某种事件。
  • 资源共享:多个进程之间共享同样的资源。
  • 进程控制:有些进程希望完全控制另一个进程的执行,此时进程控制希望能够拦截另一个进程的所有信息和异常,并能够及时知道它的状态。

2、管道通信

管道的通信方式分为无名管道和有名管道:无名管道可用于有亲缘关系的进程间的通信,有名管道克服了管道没有名字的限制。
注:有亲缘关系的进程是指具有某个共同祖先的进程。例如,一个进程经过一次或多次fork之后产生的子进程就是改进程的有亲缘关系的进程。

管道具有以下特点:

  • 管道是半双工的,数据只能向一个方向流动;在进行双向通讯时,需要建立两个管道;
  • 只能用于父子进程或兄弟进程之间;
  • 对于管道两端的进程而言,就是一个文件,但它不属于某种文件系统,单独构成一种文件系统,并且只存在于内存中;
  • 一个进程向管道中写入的内容被管道另一端的进程读出,写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

3、信号通信:

信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号何时到达。
信号是进程间通信机制中唯一的异步通信机制,可以看作异步通知,通知接收信号的进程有哪些事件发生了。

①、信号的来源:

a、硬件来源(按下了键盘等操作);
b、软件来源(如系统函数kill、raise等)。

②、信号的种类:

a、根据可靠性划分:可靠信号和不可靠信号;
b、根据时间关系划分:实时信号和非实时信号。

注:非实时信号都不支持排队,都是不可靠信号;实时信号都支持排队,都是可靠信号。

③、信号的处理方式:

a、忽略信号:对信号不做任何处理;
b、捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数;
c、执行默认操作:Linux对每种信号都规定了默认操作。

4、消息队列:

  • 消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式和特定的优先级;
  • 对消息队列有写权限的进程可以按照一定的规则添加新消息,对消息队列有读权限的进程则可以从消息队列中读走消息,消息队列是随内核持续的。
  • 目前有两种类型的消息队列:POSIX消息队列和系统V消息队列。

5、信号灯:

  • 信号灯主要提供对进程间共享资源的访问控制权限,相当于内存中的标志,进程可以根据它判断是否能够访问某些共享资源,同时,进程也可以修改该标志;
  • 除了用于访问,还可以用于进程同步;
  • 信号灯有两种类型:
    a、二值信号灯:最简单的信号灯形式,信号灯的值只能取0和1,类似于互斥锁;
    b、计算信号灯:信号灯的值可以取任意非负值。

6、共享内存:

  • 共享内存是最有效的进程间通信方式,也是最快的IPC形式;
  • 两个不同的进程A和B共享内存,即同一块物理地址被映射到进程A和B各自的进程地址空间,进程A可以即时看到进程B对共享内存中数据的更新;
  • 由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。

你可能感兴趣的:(Linux,C编程,linux,c语言,开发语言,驱动开发)