Linux系统编程
第八单元 进程间通信
第八单元 进程间通信
8.1 8.2 8.3 8.4 8.5 8.6 进程间通信简介 管道 信号 信号量 共享内存 消息队列
2
Linux进程间通信
信号,管道
3
Linux进程间通信
8.2 管道 8.3 信号 8.4 信号量 8.5 共享内存 8.6 消息队列 9 socket
4
第八单元 进程间通信
8.1 8.2 8.3 8.4 8.5 8.6 进程间通信简介 管道 信号 信号量 共享内存 消息队列
5
管道命令
|:将管道前命令的输出作为管道后命令的输入
6
管道
单向传输,如果需要双方通信需建立两个管道
无名管道pipe:进程本身或父子进程间使用 有名管道fifo:无亲缘关系进程间也可使用
单独构成一种独立的文件系统
管道对于管道两端的进程而言,就是一个文件,但它不 是普通的文件,它不属于某种文件系统,而是自立门户, 单独构成一种文件系统,并且只存在于内存中。
发送进程
7
字符先进先出
接收进程
8.2 管道
8.2.1 无名管道pipe 8.2.2 文件描述符重定向 8.2.3 有名管道fifo
8
无名管道
#include
9
无名管道举例
(pipefork.c):父子进程使用管道通信
在fork前创建管道,如父进程的文件描述符为3、4 fork后子进程也继承了父进程的管道3、4 父进程或子进程只需拥有管道的一端
父进程文件描述符 0 1 2 3 4
子进程文件描述符 0 1 2 3 4
10
8.2 管道
8.2.1 无名管道pipe 8.2.2 文件描述符重定向 8.2.3 有名管道fifo
11
输入输出重定向
标准输入——键盘,标准输出——屏幕 将标准输入或输出改成文件即为重定向 举例:
cat命令:获取键盘输入并回显到屏幕上 cat
cat >test02 :标准输出重定向
本应输出到屏幕的信息改输出到test02中
重定向实质:将标准输入或输出的文件描述符复 制到某个指定的文件上。
dup和dup2
将一个文件描述符(新)复制到另一个现有的文件 描述符(旧)上,即指向现有的文件表项。
dup
新描述符是默认当前最小可用的文件描述符
dup2
新描述符可以通过参数任意指定,如果指定的已 经被占用,则自动将其关闭并重新使用。
13
dup
#include
i
5
i
14
dup2
#include
15
dup2用于重定向
假设fd代表某文件的描述符
输入重定向:dup2(fd,0); 输出重定向:dup2(fd,1)
举例:dupin.c,dupout.c
选作;在myshell中增加I/O 重定向功能 编程时注意重定向符号不要用标准的> >> < << 自定义新的如( )
16
实现who|sort
即使用无名管道将执行who命令的进程与执 行sort命令的进程联系在一起,将当前系统 用户信息按排序方法输出。 过程及示例代码见教材。
17
2010-12-7
人民邮电出版社出版 杨宗 德编著
Shell管道命令的实现(who | sort)
(2)fork who (1)Pipe 0 1 2 3 4 屏幕 (4)dup2 键盘 (6)dup2 0 1 2 3 4 (7)Close
18
Shell
(3)fork sort
(5)Close
管道
8.2 管道
8.2.1 无名管道pipe 8.2.2 文件描述符重定向 8.2.3 有名管道fifo
19
有名管道
无名管道只有具有亲缘关系的进程可以使用,如 父子进程通信。 有名管道有名字,能够获得其名字的进程都可以 使用。 有名管道的名字可以在目录树中找到,但占用的 是内存空间,不拥有磁盘块。
20