Linux-进程间通讯-管道
进程间通讯:
A进程怎样将“hello world”传递给B进程:
I:利用文件实现:需要一个“中间人”进行传递 --- 文件(在磁盘中存储),A先调用open函数打开文件,再用write函数写文件,B用read函数读取文件,但问题如下:
1.如果A发送了数据B进行了接收,但A的数据没有被清空
2.如果A发送了数据B接收了,但A并没有在文件中写入数据,而B进程也没有发生阻塞
3.读取文件使用i/o操作,耗费时间
所以,文件不适合进程之间的交互。
II:可用
在进行管道-信号量-消息队列后,A进程发送的文件会自动清空,并且B进程读取文件时发现文件为空时会发生阻塞,停止接收,直到文件不为空
1.管道
管道通信原理:在内存上开辟一个空间,A、B进程都通过文件描述符操作这块空间,以完成交互的功能(两个进程不会有交集)
管道文件:仅仅是目录树中的一个表示,并不在磁盘中占据空间。
1.1 有名管道
特性:有名字的管道,可以在任意两个进程间传递数据
创建:mkfifo命令 和 mkfifo()函数 进行创建
使用:打开 open(路径+文件名,O_WRONLY)只写打开
写数据 write(open的返回值,内容,长度)
读取文件 read(open的返回值,buff,长度127)
关闭 close(open的返回值)
特点:(1) 如果进程以只写操作打开管道,并且没有以只读或者读写打开这个管道的另一个进程,则打开操作会阻塞,直到有进程以只读或读写打开这个管道,open才会返回。
(2) 如果进程以只读或者读写打开管道,并且没有以只写操作打开这个管道的另一个进程,则打开操作会阻塞,直到有进程以只写打开这个管道,open才会返回。
(3) 当写端没有写入数据时,读端会阻塞read调用,直到写端写入数据。
(4) 当管道没有空间时,再写入数据就会被阻塞,直到有进程读取数据,或者所有读端关闭(当完成数据交换时,A进程会自动清空数据)
1.2 无名管道
2. 信号量
3. 消息队列
4. 共享内存
III:扩展内容
1. 管道大小?怎样修改管道大小?
练习:A进程接收用户收入,B进程统计用户输入的字符个数,当用户输入end结束,并且end不计入字数。