【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。
可以作为线程之间的一种通讯方式。
- 【Linux】管道的Helloworld
- 关于linux的管道
- linux下的管道
- linux的管道和命名管道
- linux的管道和命名管道
- linux的管道和命名管道
- Linux进程的管道通信
- linux 下管道的使用
- Linux管道的一些细节
- Linux管道的实现机制
- Linux系统的管道命令
- Linux下的管道编程
- Linux管道的实现机制
- linux匿名管道的应用
- Linux系统的管道命令
- Linux管道的实现机制
- linux的有名管道学习
- linux 简单的命名管道
- JS是按值传递还是按引用传递
- spring各jar包功能【整理】
- pip使用非默认地址更新&安装所需要的包
- mybatis和hibernate 解析
- lintcode,合并两个排序链表
- 【Linux】管道的Helloworld
- Android 5.0之后隐式声明Intent 启动Service引发的问题
- 解决Android Studio的ADB连接不到手机问题
- Android使弹窗Toast是以覆盖的形式显示!
- Maven 命令行选项
- 第二章 神经网络pybrain介绍
- winows10启动后桌面闪屏
- HTML常用标签大全(前篇)
- 机器学习简介及常用算法