嵌入式学习之Linux 进程间的通信(1)

文章详细介绍了进程间通信(IPC)的概念,包括管道通信的两种类型——管道和有名管道,以及它们的特点和使用方法。有名管道允许不相关进程间通信。此外,还讨论了消息队列,一种存储在内核中的消息链表,支持随机查询和优先级。文章提供了相关编程练习以加深理解。
摘要由CSDN通过智能技术生成

1.什么是进程间的通信?

不同的进程之间传播或交换信息,每个进程都有不同的用户地址空间,进程A的全局变量,进程B无法看到,所以进程间的通信需要经过内核,在内核开辟一个缓冲区,进程A把数据复制到缓冲区,进程B从缓冲区读取数据,这种机制成为IPC。

IPC类型分为:

 2.管道通信

概述:管道是一种连接一个进程的标准输出到另一个进程的标准输入的方法,是一种单向的通信方法,管道通信分为管道和有名管道,管道用于具有亲缘关系的进程间的通信,有名管道除了管道的功能以外,还可以用于不相关进程间的通信。

a)管道

特点:(1)半双工(数据只能在一个方向上流动),具有固定的写端和读端  (2)只能用于具有亲缘关系的进程间的通信  (3)它是一种特殊的文件,可使用read 、write等函数进行读写,它不属于文件系统,只存在于内存中,管道内的数据读取完就没了,就像水流过水管,流过就没了。

原型:#include <unistd.h>    int pipe(int fd[2])   //成功返回0,失败返回-1

建立一个管道时,它会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开,关闭管道只需close(fd[0])和close(fd[1])。

练习:父进程创建子进程,调用管道,父进程写入"This is father",子进程读取并打印。

注意:先创建管道再创建子进程,否则父进程无法写入数据

 b)有名管道

特点:(1)可以在无关进程之间进行数据交换  (2)FIFO有路径名与之相关,它是一种特殊设备文件形式存在于文件系统中。

 原型:#include <sys/sta.h>    int mkfifo(const char *pathname,mode_t mode)   //成功返回0,失败返回-1

注意:创建有名管道时,附带O_NONBLOCK,read函数不会阻塞,即不等待write函数写入数据,不停的读取,正常情况下,不附带O_NONBLOCK,等待write函数写入数据,read函数再读取。

练习:创建有名管道,使两个非亲缘进程之间单向通信

read_fifo.c

 write_fifo.c

3.消息队列

概述:消息队列,是消息的链接表,存放在内核中,由内核进行管理。一个消息队列有一个标识符(即队列ID)来标识。

特点:(1)队列具有特定的格式以及特定的优先级   (2)消息队列独立于发送与接受进程,进程消亡,消息队列及其内容不会被删除   (3)消息队列可以实现随机查询,消息不需要按次序读取,可以按照消息的类型读取

原型:

key:键值与消息队列的号码相对应   flag:IPC_CREAT//没有对应的号码,则创建并需要附带权限

msgsnd与msgcrv中的flag:0  //阻塞

练习:消息队列编程收发数据

 左:msg_read.c    右:msg_write.c

补充:上一个练习直接将key写死,正常情况需要调用ftok()函数,获取键值

ftok()函数 

概述:系统建立IPC通迅(消息队列、信号量、共享内存)时必须指定一个ID值,通过ftok函数获取

原型:

#include <sys/types.h>     #include <sys/ipc.h>

key_t ftok(const char *fname,int id)   

fname:指定文件名(已存在),一般为当前目录用" . ",代替   

id:子序号

练习:键值生成及消息队列移除

左:msg_read.c    右:msg_write.c

 在上一练习的基础上增加ftok函数(21行),使代码更正规!增加移除内核中队列的函数(37行)

注意:msg_read.c第36行应补充sleep(1),等待msg_write.c获取msg_read.c发送的队列,再删除队列,否则输出乱码!!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值