红联Linux门户
Linux帮助

【Linux】管道的Helloworld

发布时间:2016-12-16 10:13:09来源:linux网站作者:yongh701
Linux的管道传输数据的一种方式,但注意并是唯一方式。数据传输的方式,你可以用简单的全局变量传递数据,文件传递数据等等,但这种管道传输的方式,你要看得懂,还算是略为常用。
你可以理解为,两个电话的人,听筒与话筒,而数据则在无线电中传输一样。
Linux管道的用法算是比较复杂,至少远比全局变量传递数据复杂,先贴一个不带其它概念的管道,helloworld级别的程序:
 
#include <stdio.h>  
#include <unistd.h>//管道所在的头文件  
#include <string.h>//用来测定字体长度strlen()的头文件  
#define MAX_LINE 80//设置缓冲区的大小  
int main(){     
const char* string={"你好世界"};     
int myPipe[2];  
char buffer[MAX_LINE+1];  
if(pipe(myPipe)==0){//创建一个匿名管道  
//myPipe[1]为写管道;myPipe[0]为读管道。             
write(myPipe[1],string,strlen(string));//对管道写入一个字符串     
int ret=read(myPipe[0],buffer,MAX_LINE);//将管道的东西读到缓冲区  
buffer[ret]='\0';//字符串数组封口  
printf("%s\n",buffer);//缓冲区数组  
}  
//一般管道的管道的开启与关闭成轴对称  
close(myPipe[0]);  
close(myPipe[1]);  
return 0;  
}
 
运行结果如下:
【Linux】管道的Helloworld
 
这个程序的过程,就是通过pipe()函数,将一个简单的int数组,而且linux规定为长度为2的数组myPipe,不然会有奇奇怪怪的bug,转化为管道的两头。
而且规定的1这个位置就是写的位置,也就是你只能向myPipe[1]这个位置用write函数写数据。至于这里写入一个const char*,就不说了,详见《【Linux】纯C环境下字符串的处理》(http://www.linuxdiyf.com/linux/17719.html),这是Linux-C规定对字符串处理的方式,也就是Java与C#的String。
 
然后,我们要在规定的0这个位置读数据。我曾经试过在0这个位置写数据,在1这个位置读数据,不按Linux的规定来,结果发现数据最后损坏了,读出来一段乱码。
所以,我们权当这是Linux中对管道的基本结果,记住读写的位置。我通过read函数将myPipe[0]这个位置的东西,读到一个所谓“缓冲区”的字符数组,这个“缓冲区”与其它的“缓冲区”没有任何关系,只是一个接字符串的字符数组叫做缓冲区buffer。你可以这就是String buffer,一个变量,和那些什么“缓冲区注入”没有半点关系。
read函数返回值是一个读了多少字符长度的int,这个数值,刚好为字符数组,最后一个位置封口,也就是用'\0'填充最后一个位置,不然printf会将后面没有被定义的乱码打出来。
 
最后关闭管道,整个程序运行过程就这样。
看这个程序,就做了一件a=B=c的事情,管道就如同一个全局变量B,我们将a中的"你好世界"赋值给B,之后B的值再赋值给C。
可以作为线程之间的一种通讯方式。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/26949.html