应用开发中常用的进程线程通信

进程通信是学习应用编程的基础,尤其是对于大型嵌入式项目而言,熟悉常用的通信方式是能写好代码和能看懂代码的前提。其实在大学刚接触linux就学习过进程间的几种通信方式,不过由于当时接触的项目都比较简单,导致没能对这几种通信有比较好的理解和应用。工作之后有了大量的代码阅读量,感觉对几种通信的应用有了新的认识,所以坐下简单的总结。

  1. 共享内存
  2. 信号量
  3. 消息队列
  4. 管道

共享内存

共享内存是几种通信方式中常用的程序间通信方式容易理解的。(如果不理解共享内存这个名词,你可直接把他想象成常用标志位,不过这个标志位可能会是个很大的结构体或数组)这里对共享内存的介绍分为进程间和线程间两部分总结。
1.线程间
线程间的共享内存是最简单的,因为相同进程共享全局和静态变量,所以只要定义全集变量,即可实现多个线程共享内存实现数据通信了。
2.进程间
由于各个进程的内存空间是独立的,所以全局变量那一套是走不通的。这时需要使用共享存储,共享存储允许多个进程共享一个特定的内存缓冲区。常用的接口如下:
shmget()获取共享内存标识符
shmat()虚拟地址转换

(接口只做了简单的总结,具体的函数原型,可以借助工具书和百度)

在这里插入图片描述

以常用的客户进程与服务进程为例:
C进程,S进程
C调用S对外接口get_shm_addr(),S的get_shm_addr()需要实现内存的申请,获取共享内存标识符,虚拟地址转换,最后把转换后的地址返回给C,C和S就可以通过共享存储的方式通信了。

注意:不管是线程还是进程间的通信,都需要C-S两端控制缓冲区的互斥使用,C去写数据时,S也去写数据如何处理?这里就需要不同的应用场景不同的控制了。一般通过信号量或自行定义读写指针辅佐控制。

posix信号量

posix信号量与之对应的是XSI信号量,课本上讲的就是XSI信号量。不过posix信号量作为后来者,无论在性能和使用规范上都明显优于后者。所以这里也是简单介绍下posix的信号量。
(信号量通俗理解,简单的可以真的可以理解成一个可以在进程间共享的标志位,不过这个标志位是需要使用系统接口才能对标志位进行加减)
常用到的接口包括
创建信号量,sem_open()
关闭信号量,关闭信号量对应的fd ,sem_close()
删除信号量,sem_unlink()
发送信号量,对信号量进行+1操作sem_post()
接受信号量,对信号量进行-1操作sem_wait()

(接口只做了简单的总结,具体的函数原型,可以借助工具书和百度)

sem_wait是阻塞接受,还有直接返回,和超时接受两个接口。常用的信号量是二进制信号量,即信号量是非一即零的标志。与之对应的还有计数信号量。信号量是何种类型是在信号量创建时确定的。

posix消息队列

和信号量一样,队列这里也只总结常用的posix消息队列,XSI消息队列不做总结。
消息队列可以说是线程间通信中,最常用到的通信方式之一了。
常用的接口
创建队列mq_open()
关闭队列mq_close()
删除队列mq_unlink()
发送消息mq_send()
接受消息mq_receive()

(接口只做了简单的总结,具体的函数原型,可以借助工具书和百度)

常用的消息队列使用模式是,多个C线程向同一个S线程发送消息。例如C1、C2作为单独处理线程,S作为网络通信线程,C1、C2可以都通过同样的消息队列,发送消息给S实现数据上行。

管道

管道分为无名管道和有名管道,无名管道可以用作主子进程之间的通信。有名管道也就是常说的FIFO,可作为任意进程间的通信。
(通俗理解,管道和文件读写一样,可以将管道看做一个文件,比较特殊的是他有读写描述符是不一样的)
由于管道通信与文件读写基本一样,这里不做其他说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值