Liunx系统编程–进程通信(一),创建无名管道
IPC
进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息,方式通常
有管道(无名管道和命名管道),信号量,消息队列,共享存储,Socket,Streams等。其中Socket,Streams支持不同主机上的两个进程IPC。
管道通信原理
1.管道,通常是指无名管道,是UNIX系统IPC最古老的形式,通常有以下特点
-
它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
-
它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
-
它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
-
管道中的数据被读走就没了(不存储数据)
构建原理
#include <unistd.h>
int pipe(int fd[2]);
// 返回值:若成功返回0,失败返回-1
当一个管道建立时,它会创建两个文件描述符:fd[0]为读而打开,fd[1]为写而打开。管道的建立存在与内核之中,关闭管道只需要将文件描述符关闭即可。
例子
//父进程写hello father,子进程读取出来
# include <stdio.h>
# include <unistd.h>
# include <stdlib.h>
# include <string.h>
int main ()
{
int fd[2];
// int pipe(int fd[2]);
pid_t pid;
char readbuf[128];
if(pipe(fd)==-1)//创建管道
printf("管道创建失败\n");
else
printf("管道创建成功\n");
pid=fork();//创建进程
if(pid<0)
printf("创建进程失败");
if(pid>0)
{
sleep(3);
printf("进入父进程\n");
close(fd[0]);
write(fd[1],"hello from father",sizeof("hello from father"));
wait();
}
if(pid==0)
{
printf("进入子进程\n");
close(fd[1]);
read(fd[0],readbuf,128);//如果管道没有数据,就会在这里堵塞,等待父进程>写完后,在读取管道的信息
printf("read form father:%s\n",readbuf);
exit(0);
}
return 0;
}
//结果
xin@xin-virtual-machine:~/桌面/linkr/进程间通信$ ./a.out
管道创建成功
进入子进程
进入父进程
read form father:hello from father
nkr/进程间通信$ ./a.out
管道创建成功
进入子进程
进入父进程
read form father:hello from father