进程间通信概念:(IPC)
每个进程都有各自不同的进程地址空间,任何一个进程的全局变量在另一个进程中都看不到,因此进程之间要交换数据必须要通过内核,在内核中开辟一块缓冲区,进程把数据从用户空间拷贝到内核区,再从内核缓冲区取出数据。这就叫进程间的通信。
管道技术:(pipe)
是一种最基本进程间通信机制,它是基于字节流的。分为匿名管道和命名管道。
调用pipe函数时,会在内核区开辟一块缓冲区用于通信,它有一个读端和一个写端,通过参数传给用户程序两个文件描述符,0指管道的读端,1指管道的写端,因此管道在用户程序看来就像一个打开的文件,向这个文件读写数据,其实就是读写内核缓冲区。
匿名管道特点:单向通信;必须是有血缘关系的进程间通信;管道内部自有机制来保护数据能读写完全;是一种面向流式的服务
父进程调pipe开辟管道,得到两个文件描述符指向管道两端;用fork创子进程,子进程也有两个文件描述符指向同一管道;父进程关闭管道写端,子进程关闭管道读端。
运行结果:
使用管道时应注意四种特殊情况:
1.指向管道的写端没关闭,但是也不写数据,此时指向管道的读端还一直再读数据,当读完管道的数据后,再次读会阻塞,知道管道中有数据了才读取数据并返回。
如图,当count等于5时,让它停止写入,此时读端会阻塞。
2.指向管道的读端没关闭,但是也不读数据,此时指向管道的写端还一直再写数据,当管道被写满时,再次写会阻塞。知道管道中有空位置了才写。(代码类似1)
3.如果指向管道的写端都关闭了,而指向管道的读端还在读,当剩余数据被读完后,再次读会返回0,好比已经读到文件结尾了。
4..如果指向管道的读端都关闭了,而指向管道的写端还在写,那么此时该进程会收到一个SIGPIPE,使进程异常终止。
命名管道:(FIFO)它可以用于任何两个进程间的通信,不管是否有血缘关系,它是存在于用盘上的文件,在文件系统中以文件名的方式存在,它是一个可见的文件。可以通过文件系统公共路径名来表示一个IPC通道。它按照先进先出原则,第一个被写入的数据总是第一个先被读出来。
写端往文件里里写入数据
读端读取数据
运行结果:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。