进程通信是指在进程间交换信息(传输数据)。目前的计算机系统均提供了多任务并行环境,无论是应用程序还是系统程序,都需要针对每一个任务创建相应的进程。
每个进程之间都是相互独立的,不同的进程运行在各自不同的内存空间中,因此,进程之间的信息传递不可能通过变量或其他数据结构直接进行,只能通过进程间通讯完成。
进程间通讯方式:信号 、管道、信号量、消息队列、共享内存、Socket
今天介绍一下通过管道进行程序间的通讯。管道分为有名管道和无名管道。
(管道文件)(半双工通讯:数据流向是单向的。)
有名管道:在文件系统中存在一个文件标识(文件名),但是管道文件不占据磁盘空间,需要传递的数据缓存在内存区域。可用于运行与通一系统中的任意两个进程。(有属性信息,inode节点存在磁盘上)
无名管道:用于父进程和子进程间的通信。无属性信息,没有inode节点了。
之前我们可以通过文件可以互相获取数据。(将数据放在磁盘)通过i/o获取(慢)
管道文件创建:(命令)mkfifo 文件名
(函数)Int mkfifo(const char *pathname ,mode_t mode)
第一个参数将要在文件系统中创建一个专用文件,第二个参数来规定FIFO的读写权限。
不能用open创建一个管道文件
管道文件的操作:
打开 : int open(char *path ,int flag )
读: int read ( int fd ,void *buff,size_t size)
写: int write(int fd ,void *buff, size_t size)
关闭 :int close(int fd)
1、open以只读打开一个管道文件,open会阻塞运行,直到有一个进程以只写或读写打开管道文件。
2、open以只写打开一个管道文件,open会阻塞运行,直到有一个进程以只读或读写打开管道文件。
3、read函数也会阻塞运行,直到管道中有数据或关闭。
4、write函数也会阻塞运行,当写的太多被写满了就阻塞运行要等数据读走才能接着写。