文档视界 最新最全的文档下载
当前位置:文档视界 › Linux系统编程第八单元2

Linux系统编程第八单元2

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 int pipe(int pfd[2]); 参数:pfd:文件描述符数组,0读1写 返回值:成功返回0,错误返回-1(置errno) 说明: 创建一个管道,这个管道是由pfd[0],pfd[1]两个文件 描述符表示的一个通信信道,大小4096。 pdf[1]为写文件描述符,pfd[0]为读文件描述符。 对管道读写用read,write
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 本应从键盘获取的信息改从文件test01中获取
cat >test02 :标准输出重定向
本应输出到屏幕的信息改输出到test02中
重定向实质:将标准输入或输出的文件描述符复 制到某个指定的文件上。

dup和dup2
将一个文件描述符(新)复制到另一个现有的文件 描述符(旧)上,即指向现有的文件表项。
dup
新描述符是默认当前最小可用的文件描述符
dup2
新描述符可以通过参数任意指定,如果指定的已 经被占用,则自动将其关闭并重新使用。
13

dup
#include int dup(int fd); 参数:现有文件描述符 返回值: 成功返回新文件描述符(最小可用的文件描述符) 错误返回-1(置errno) 说明:将最小可用文件描述符指向fd对应的打开文件描述 如dup(3)
i
5
i
14

dup2
#include int dup2(int fd ,int fd2); 参数: fd:旧文件描述符 fd2:新文件描述符 返回值:成功返回新文件描述符,错误返回-1(置errno) 说明: dup2(3,5)与上图示例同理。 若fd2已经被使用,则自动关闭fd2 用于重定向 如dup2(3,1)则关闭1标准输出,并将1复制到3上。
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

相关文档