进程间通信
因为每一个进程都拥有自己的独立的进程虚拟地址空间,导致了进程的独立性。进程间的通信技术是为了让各个进程之间可以很好的交换数据或者进程控制而产生的。
常用的进程间通信的方式有管道、共享内存、消息队列和信号量。
匿名管道
管道有分为匿名管道和命名管道两种,接下来主要介绍管道通信中的匿名管道。匿名管道就是指在内核中创建出来的一块没有标识符的一段缓冲区。
匿名管道的创建
在Linux系统中,可以用pipe函数来创建匿名管道
函数原型:
#include <unsitd.h>
int pipe(int fd[2]);
参数解释:
fd[2]:
(1)本质上是一个出参,fd[0],fd[1]当中的值是pipe函数赋予的
(2)fd[2]数组中有两个元素,保存的都是文件描述符,fd[0]表示写端,fd[1]表示读端
返回值:
成功返回0,失败返回-1
例子:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int fd[2];
char buf[100];
int len;
int pipeid = pipe(fd);
if(pipeid < 0)
{
perror("pipe");
return -1;
}
while(fgets(buf,100,stdin))
{
len = strlen(buf);
if(write(fd[1],buf,len) != len)
{
perror("write to pipe!\n");
break;
}
memset(buf,0x00,sizeof(buf));
if((len = read(fd[0],buf,100)) == -1 )
{
perror("read from pipe!\n");
break;
}
if(write(1,buf,len) != len)
{
perror("writer to stfout!\n");
break;
}
}
}
管道是半双工通信,这就意味着数据流向只能是从写端流向读端
查看进程ID
用ll /proc/进程号/fd命令查看
关闭进程,再次查看,发现找不到该目录
说明管道的生命周期是跟随进程的。
匿名管道是没有标识符的,就像一个人没有名字一样,我们也不认识他,所以在茫茫人海中,我们就无法通过名字找到这个人,这也就意味着进程无法通过标识符来找到这个管道,但是进程之间又要进行通信,这时候我们就联想到子进程的创建了,子进程创建的原理是复制父进程的PCB,代码共享数据独享,因此我们可以通过创建子进程的方法来找到这个管道实现进程间的通信。(注意:一定要先创建管道在创建子进程)
例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fd[2];
int ret