进程间通信 华清远见-《嵌入式 Linux 应用程序开发标准教程》学习记录

在 Linux 中使用较多的进程间通信方式主要有以下几种。
(1)管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。
(2)信号(Signal) :信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的。
(3)消息队列(Messge Queue) :消息队列是消息的链接表,包括 Posix 消息队列 SystemV 消息队列。它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息; 对消息队列有读权限的
进程则可以从消息队列中读取消息。
(4)共享内存(Shared memory):可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量等。
(5)信号量(Semaphore):主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段。

(6)套接字(Socket):这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。


一、管道

管道是 Linux 中一种很重要的通信方式, 它是把一个程序的输出直接连接到另一个程序的输入。

如:sfe1012@sfe1012-ThinkPad-Edge-E540:~$ ps -ef|grep ntp
       sfe1012   7365  7262  0 22:34 pts/1    00:00:00 grep --color=auto ntp 

       ps -ef:将会输出所有的运行进程,作为grep的输入,ntp进程名字是ntp的服务,将会被选择出来,并且打印。

这里主要指无名管道,它具有如下特点:

它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间)。

它是一个半双工的通信模式,具有固定的读端和写端。

管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read()和 write()等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内核的内存空间中。

管道的创建与关闭

管道是基于文件描述符的通信方式,当创建一个管道的时候,就会同时创建两个文件描述符号fd[0](用于读取管道)、fd[1](用于写管道),这样就形成了一个办双工的通道了。

要想关闭管道,只需要将这两个文件描述符号分别关闭就可以了,用close();

管道的创建函数

int pipe(int fd[2])   头文件:unistd.h

管道应用说明

pipe()函数创建的管道两端处于一个进程中,由于管道十主要用于在不同进程间通信的,因此这在实际的应用中没有太大意义。所以通常先创建一个管道,在通过fork函数创建一个子进程,该子进程会继承父进程所创建的管道,这时候。如图8.4所示。这样我们可以关闭父进程的fd[1](写)和子进程的fd[0](读)就形成了图8.5所示,能够实现子进程向父进程写入数据的管道的方法,同样我们也可以关闭另外的方法,实现父进程向子进程写入数据的管道方法。



273

华清远见嵌入式linux应用程序开发技术详解(内部资料) 第1章 Linux快速入门   1.1 嵌入式Linux基础   1.2 Linux安装   1.3 Linux文件及文件系统   1.4 实验内容——安装Linux操作系统   本章小结   思考与练习  第2章 Linux基础命令   2.1 Linux常用操作命令  2.2 Linux启动过程详解  2.3 Linux系统服务  2.4 实验内容   本章小结   思考与练习  第3章 Linux下的C编程基础   3.1 Linux下C语言编程概述  3.2 进入Vi  3.3 初探Emacs   3.4 Gcc编译器   3.5 Gdb调试器  3.6 Make工程管理器  3.7 使用autotools   3.8 实验内容   本章小结   思考与练习  第4章 嵌入式系统基础   4.1 嵌入式系统概述   4.2 ARM处理器硬件开发平台   4.3 嵌入式软件开发流程   4.4 实验内容——使用JTAG烧写NAND Flash   本章小结   思考与练习  第5章 嵌入式Linux开发环境的搭建   5.1 嵌入式开发环境的搭建   5.2 U-Boot移植   5.3 实验内容——移植Linux内核   本章小结   思考与练习  第6章 文件I/O编程   6.1 Linux系统调用及用户编程接口(API)  6.2 Linux中文件及文件描述符概述   6.3 不带缓存的文件I/O操作   6.4 嵌入式Linux串口应用开发  6.5 标准I/O开发   6.6 实验内容   本章小结   思考与练习  第7章 进程控制开发   7.1 Linux下进程概述  7.2 Linux进程控制编程   7.3 Linux守护进程   7.4 实验内容   本章小结   思考与练习  第8章 进程间通信   8.1 Linux进程间通信概述   8.2 管道通信   8.3 信号通信  8.4 共享内存   8.5 消息队列  8.6 实验内容   本章小结   思考与练习 第9章 多线程编程   9.1 Linux下线程概述   9.2 Linux线程实现   9.3 实验内容——“生产者消费者”实验   本章小结   思考与练习  第10章 嵌入式Linux网络编程   10.1 TCP/IP协议概述   10.2 网络基础编程   10.3 网络高级编程   10.4 ping源码分析   10.5 实验内容——NTP协议实现   本章小结   思考与练习  第11章 嵌入式Linux设备驱动开发   11.1 设备驱动概述  11.2 字符设备驱动编写   11.3 LCD驱动编写实例  11.4 块设备驱动编写  11.5 中断编程   11.6 键盘驱动实现   11.7 实验内容——skull驱动   本章小结   思考与练习  第12章 Qt图形编程   12.1 嵌入式GUI简介  12.2 Qt/Embedded开发入门  12.3 实验内容——使用Qt编写“Hello,World”程序   本章小结 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值