操作系统为用户提供的几种进程间的通信方式
进程间因为每一个进程都有一个虚拟地址空间,在保证了进程独立性的同时,却使得进程间无法直接通信。因此需要操作系统来提供进程间通信方式,并且因为通信场景不同,提供的方式也有多种
给多个进程之间提供一个大家都能访问到的传播介质,并且操作系统在提供进程间通信方式的时候也根据通信场景的不同提供不同的方式
systemV标准的通信方式:
什么是管道?
管道的本质:
操作系统在内核中为进程创建的的一块缓冲区,若多个进程可以访问到同一块缓冲区,就可以实现进程间通信 —通过半双工通信(可以选择方向的单向通信)实现数据传输
定义:
在这块内核中的缓冲区没有明确的标识符,其他进程无法直接访问管道
特性:
多个进程只要能够拿到同一个管道(缓冲区)的操作句柄就可以进行通信
#include
功能:创建一匿名管道
函数原型
int pipe(int fd[2]);
参数
fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端
返回值:成功返回0,失败返回错误代码(-1)
注意:
从键盘读取数据,写入管道,读取管道,写到屏幕
#include
#include
#include
#include
int main()
{
int fds[2];
char buf[100];
int len;
if ( pipe(fds) == -1 )
perror("make pipe error"),exit(1);
// read from stdin
while ( fgets(buf, 100, stdin) ) {
len = strlen(buf);
// write into pipe
if ( write(fds[1], buf, len) != len ) {
perror("write to pipe error");
break;
}
memset(buf, 0x00, sizeof(buf));
// read from pipe
if ( (len=read(fds[0], buf, 100)) == -1 ) {
perror("read from pipe error");
break;
}
// write to stdout
if ( write(1, buf, len) != len ) {
perror("write to stdout error");
break;
}
}
return 0;
}
定义:
内核中的缓冲区,这块缓冲区具有标识符(标识符是一个可见于文件系统的管道文件),其他的进程可以通过这个标识符,找到这个缓冲区(通过打开一个管道文件,进而访问到同一块缓冲区),进而实现通信
可用于同一主机上的任意进程间通信
多个进程通过命名管道通信时通过打开命令管道文件访问同一块内核中的缓冲区实现通信
命令操作: mkfifo filename
int mkfifo(const char *filename, mode_t mode) ---创建命名管道文件
管道的读写:(不管是匿名还是命名都一样)
若管道中没有数据,则调用read读取数据会阻塞;若管道写满了,则调用write写入数据会阻塞;(阻塞:为了完成一个功能,发起调用,若当前不具备完成条件,则一直等待)
若管道所有读端pipefd[0]被关闭,(表示没有进程读取数据了),继续write会触发问题,程序退出
若管道所有的写端pipefd[1]被关闭,(表示当前没有进程继续写入数据了),read读完管道中的数据之后,就不会再阻塞,而是返回0
管道的特性:
管道是一块缓冲区(内存空间),并非无限制大
管道生命周期随进程(打开管道的所有进程退出,管道就会被释放(命名管道也一样,本质都是缓冲区,文件只是标识符))
提供字节流服务 —有序的,可靠的,基于连接的一种灵活性比较高的传输服务
命名管道额外有打开(open)特性:
管道自带同步与互斥
同步:通过条件判断,判断当前进程是否能访问,不能访问则等待,能访问的时候,再唤醒,实现对临界资源访问的合理性 (管道中没有数据则read会阻塞/管道中数据满了则write会阻塞)
互斥:通过保证同一时间只有一个进程能够访问临界资源,保证临界资源访问的安全性对管道进行数据操作的大小不超过PIPE_BUF = 4096的时候,则保证操作的原子性
管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道
A. 一个管道可以实现双向数据传输
B. 管道的容量仅受磁盘容量大小限制
C. 进程对管道进行读操作和写操作都可能被阻塞
D. 一个管道只能有一个读进程或一个写进程对其操作
正确答案: C
答案解析:
A:由于管道采用半双工通信方式。因此,数据只能在一个方向上流动,A错
B: 管道是由内核管理的一个缓冲区,其容量受多方面因素影响,包括缓冲区的大小、磁盘容量大小等问题
C: 当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。进程对管道进行读操作和写操作都可能被阻塞,因此C正确
D: 管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息,管道可以同时进行读进程和写进程
A. 进程对管道进行读操作和写操作都可能被阻塞
B. 一个管道只能有一个进程或一个写进程对其操作
C. 一个管道可实现双向数据传输
D. 管道的容量仅受磁盘容量大小限制
正确答案:A
答案解析:
A.正确,因为管道为空,读操作会被阻塞;管道满了,写操作会被阻塞
B.可以有多个进程对其读;也可以有多个进程写,只不过不能同时写。并且题目没有说“同时”,B不对
C.匿名管道只能单向;命名管道可以双向;所以C过于绝对
D.管道是内存中的,所以D不对
如果有帮助到您的,留个赞呐~~