管道:一种进程间通讯且是一种半双工的通讯方式,即在同一时间内只能由一方往管道发送或者接收数据(管道操作其实有点类似于我们往一个文件写入数据,另一个进程就把里面的数据读取出来)
(下面是关于管道的简单介绍 , 某位不知名灵魂画手在线画图)
小绿和小红是一对让人羡慕的情侣,他们分别居住在一条河的两边(别问为什么他们在河两边,因为我不想让他们在一起),然后小绿就想和小红聊天,但是他们之间有一条河,然后小红过不去,小绿又想和小红聊天;那怎么办,总不能分手吧,这个时候就需要一个中间介质管道(类似我们的对讲机,同一时刻只能一方讲话一方听),有了中间介质之后呢,小红和小绿就可以两个人一起聊天了,但是呢,聊天嘛就只能一个说,一个听,不然大家一起说时就会什么都听不见;为了避免出现这种情况,于是设计管道时便规定了管道只能是半双工的形式通讯;这个中间介质就是我们的管道
管道分类:
一、无名管道pipe : 只能在由亲缘关系的进程间通讯,本质是一块物理内存,子进程它的管道文件描述符通过父进程继承而来;其中管道的读端和写端是分开的(在创建时需要传递一个int数组进行接收管道文件的操作符),且默认管道文件操作符第0个即pipefd[0]
为读端,第1个即pipefd[1]
为写端
================================================
相关函数原型:
//函数头文件
#include <unistd.h>
//函数原型
int pipe(int pipefd[2]);
//函数介绍:
/****************************************************
函数作用:用于在父子进程间创建一个无名管道进行通讯
函数形参:pipefd[2]:一个用于接收无名管道读写文件描述符的,
数组大小为2的数组
函数返回值:
成功: 0
失败: -1
***************************************************/
测试代码:
/*
*测试:无名官道pipe父子进程间通信
*pipefd[2]---->管道文件描述符:
* 第一个代表读端
* 第二个代表写端
*/
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main(int argc, const char **argv)
{
//定义一个数组用于接收管道文件描述符
int pipefd[2];
//创建管道
pipe(pipefd);
//创建子进程
pid_t id = fork();
//判断创建子进程是否成功,失败则直接结束整个程序
if(id == -1)
{
perror("fork failed!");
return -1;
}
//子进程要做的事情
else if(id == 0)
{
//定义一个数组用于存放从管道中读取到的数据
char buf[20