【Linux】管道的Helloworld

来源:互联网 发布:js判断是不是在数组中 编辑:程序博客网 时间:2024/06/09 21:02

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;}
运行结果如下:


这个程序的过程,就是通过pipe()函数,将一个简单的int数组,而且linux规定为长度为2的数组myPipe,不然会有奇奇怪怪的bug,转化为管道的两头。

而且规定的1这个位置就是写的位置,也就是你只能向myPipe[1]这个位置用write函数写数据。至于这里写入一个const char*,就不说了,详见《【Linux】纯C环境下字符串的处理》(点击打开链接),这是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。

可以作为线程之间的一种通讯方式。

0 0