码迷,mamicode.com
首页 > 系统相关 > 详细

进程间的通信

时间:2016-04-10 19:34:07      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:缓冲区   程序   通信   技术   管道   

进程间通信概念:(IPC)

    每个进程都有各自不同的进程地址空间,任何一个进程的全局变量在另一个进程中都看不到,因此进程之间要交换数据必须要通过内核,在内核中开辟一块缓冲区,进程把数据从用户空间拷贝到内核区,再从内核缓冲区取出数据。这就叫进程间的通信。

技术分享

管道技术:(pipe)

    是一种最基本进程间通信机制,它是基于字节流的。分为匿名管道和命名管道。

调用pipe函数时,会在内核区开辟一块缓冲区用于通信,它有一个读端和一个写端,通过参数传给用户程序两个文件描述符,0指管道的读端,1指管道的写端,因此管道在用户程序看来就像一个打开的文件,向这个文件读写数据,其实就是读写内核缓冲区。

匿名管道特点:单向通信;必须是有血缘关系的进程间通信;管道内部自有机制来保护数据能读写完全;是一种面向流式的服务

技术分享

父进程调pipe开辟管道得到两个文件描述符指向管道两端;用fork创子进程,子进程也有两个文件描述符指向同一管道;父进程关闭管道写端,子进程关闭管道读端。

技术分享

运行结果:

技术分享

使用管道时应注意四种特殊情况:

1.指向管道的写端没关闭,但是也不写数据,此时指向管道的读端还一直再读数据,当读完管道的数据后,再次读会阻塞,知道管道中有数据了才读取数据并返回。

技术分享

如图,当count等于5时,让它停止写入,此时读端会阻塞。

技术分享

2.指向管道的读端没关闭,但是也不读数据,此时指向管道的写端还一直再写数据,当管道被写满时,再次写会阻塞。知道管道中有空位置了才写。(代码类似1)

3.如果指向管道的写端都关闭了,而指向管道的读端还在读,当剩余数据被读完后,再次读会返回0,好比已经读到文件结尾了。

技术分享

4..如果指向管道的读端都关闭了,而指向管道的写端还在写,那么此时该进程会收到一个SIGPIPE,使进程异常终止。

命名管道:(FIFO)它可以用于任何两个进程间的通信,不管是否有血缘关系,它是存在于用盘上的文件,在文件系统中以文件名的方式存在,它是一个可见的文件。可以通过文件系统公共路径名来表示一个IPC通道。它按照先进先出原则,第一个被写入的数据总是第一个先被读出来。

写端往文件里里写入数据

技术分享

读端读取数据

技术分享

运行结果:

技术分享


进程间的通信

标签:缓冲区   程序   通信   技术   管道   

原文地址:http://10541559.blog.51cto.com/10531559/1762375

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!