开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:无名管道的创建 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11026
无名管道的创建
内容介绍
一、管道通信的前提
二、创建无名管道的方式
三、创建无名管道的过程
一、管道通信的前提
想要用管道通信的前提是:
创建管道,之后才可以通过管道通信号。
二、创建无名管道的方式
创建无名管道的方式:pipe函数
三、创建无名管道的过程
pipe函数的形参:int filedes[2](是一个数组的地址)
int filedes[2] 有两个元素,其中一个存读端,另一个存写端描述符。
filedes(0)为读而打开 filedes(1)为写而打开.返回值为整形。成功返回0;失败返回-1
filedes为int型数组的首地址,其存放了管道文件描述符filedes[0]、filedes[1]
一旦创建管道成功之后,filedes[0]内存放的文件名是将来读的。需要在管道内写数据时,通过filedes[1]
对“filedes[0]的输出是filedes[1]的输入”的解释:
会创建管道后,我们来写一个代码去使用管道进行通信。
首先看第一个代码:
父子进程通过管道实现数据的传输
#include ‹stdio.h>
#include (string. h›
#include ‹unistd.h
#include (stdlib.h
#include <svs/types.h
#include <sys/wait. h>
int main(int argc, char *argyl])
int fd pipe[2]:
char buf[] = "hello world";
pid t pid;
if (pipe (fd pipe) < 0)
perror ("pipe" ):
pid = forkO:
if (pid < 0)
{
perror(" fork" ):
exit(-1);
}
if (pid == 0)
{
write (fd pipe[1], buf, strlen(buf));
exit(0);
}
Else
{
wait (NULL):
memset(buf, 0, sizeof (buf)) ;
read (fd pipe(0], buf, sizeof (buf));
printf("but=[%s]\n", buf);
}
Reture0;
}
指定一个整型的数组,有两个元素,其中保存着两个管道的描述符。(创建管道的时候就可以得到两个管道描述符)
注意:
必须先pipe,之后将管道继承给子进程。
从fd pipe这个数组进来,一旦成功第0个存放读的描述符,第1个存放写的描述符。
Fork继承前两个数组,也继承了文件描述符
Fork创建子进程,在子进程中往管道中写数据,因为管道是一个文件。
写数据需要通过fd pipe[1]这个轨道。Buf指内存,strlen测长度
创建完子进程之后,副进程就在wait,等子进程将数据写入之后退出。退出后将buf全部变为0.
之后在读端读东西。之后去打印。如果可以打印出hello word,说明读取成功,无名通道创建成功。
以上就是用pipe数组创建管道。