1、查看命令: man 2 pipe

2.头文件:#include <unistd.h>

3、函数原型: int pipe(int pipefd[2]);
a、pipefd[2] :无名管道的两个文件描述符,int型的数组,大小为2,pipefd[0]为读端,pipefd[1]为写端

4、返回值:
成功:返回0
失败:返回-1

5、函数特点:
无名管道是最简单的常用于一对一的亲缘进程间通信的方式,既然说是管道,所以可以想象成一条水管,连接两个进程
一个进程负责输入数据,另一个进程负责接收数据,反过来也一样。

6、无名管道的缺点:
a、没有名字,因此无法使用open()打开
b、只能用于亲缘进程间(如父子进程、兄弟进程、祖孙进程等)通信
c、半双工工作方式,读写端是分开的,pipefd[0]为读端,pipefd[1]为写端
d、写入操作不具有原子性,因此只能用于一对一的简单通信
e、不能用lseek()来定位

这是演示代码:
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<stdlib.h>
#include<wait.h>
#include<string.h> #define LENGTH 50 //字符数组的大小
int main(int argc,char **argv)
{
int status;//进程退出时用
int pipefd[];//用于保存无名管道的两个文件描述符,pipefd[0]为读端,pipefd[1]为写端 int ret;
pid_t pid; /*创建无名管道,需要在fork()之前创建,这样子进程才能继承无名管道*/
ret = pipe(pipefd);
if(ret == -)//创建失败
{
perror("pipe");
exit();//异常退出
} pid = fork();//创建子进程 if(pid != )//父进程,负责从无名管道中读取数据
{
wait(&status);//等待子进程退出
char buf[LENGTH];
read(pipefd[],buf,sizeof(buf));//从无名管道中读取数据,read函数会阻塞
printf("来自子进程的信息: %s",buf); } if(pid == )//子进程,负责把数据写入无名管道
{
char buf[LENGTH];
bzero(buf,sizeof(buf));//清空缓冲区
puts("请输入你要发送给父进程的内容:");
fgets(buf,sizeof(buf),stdin);
write(pipefd[],buf,sizeof(buf));//把数据写入无名管道
exit();//子进程退出
} close(pipefd[]);//关闭无名管道中的读端
close(pipefd[]);//关闭无名管道中的写端
return ;
}

linux之无名管道的更多相关文章

  1. linux进程间通信--无名管道

    管道 只能用于具有亲缘关系的进程之间通信是一个半双工的通信模式, 具有固定的写读端和写端,管道可以看成一种特殊的文件,对它可以使用普通的read.write等操作 管道的创建: #include &l ...

  2. Linux 进程间通信 无名管道(pipe)

    无名管道: 1)只能用于具有亲缘关系的进程之间的通信(无名管道是某一个进程创建的,不像普通文件有路径,在文件系统中是不可见的,其他进程要想打开,只能通过继承的方式去打开) 2)半双工的通信模式,具有固 ...

  3. linux中用无名管道进行文件的读写

    1管道是什么: 水管子大家知道,有两端,在此一端用来读一端用来写,其中一端的输出作为另外一端的输入. 2 函数原型 int pipe(int pipefd[2]);//参数中分别代表的两端 3 例子: ...

  4. Linux无名管道通信介绍

    Linux下无名管道一般仅用于父子进程间的通信: 测试代码如下 //file name: fifo_test.c #include <sys/prctl.h> #include " ...

  5. linux进程间通信之一:无名管道

    无名管道是linux中管道通信的一种原始方法,有以下特征: 1.单工通信模式,具有固定的读端和写端: 2.管道可以看成是一种特殊的文件,对于它的读写可以使用普通的read(),write()等文件IO ...

  6. Linux简单程序实例(GNU工具链,进程,线程,无名管道pipe,基于fd的文件操作,信号,scoket)

    一, GNU工具链简介: (1)编译代码步骤: 预处理 -> 编译 -> 汇编 -> 链接: 预处理:去掉注释,进行宏替换,头文件包含等工作: gcc -E test.c -o te ...

  7. Linux 进程通信(无名管道)

    无名管道 无名管道是半双工的,就是对于一个管道来讲,只能读,或者写. 无名管道只能在相关的,有共同祖先的进程间使用(即一般用户父子进程). 一个fork或者execve调用创建的子进程继承了父进程的文 ...

  8. linux无名管道

    特点 无名管道是半双工的,也就是说,一个管道要么只能读,要么只能写 只能在有共同祖先的进程间使用(父子进程.兄弟进程.子孙进程等) fork或者execve调用创建的子进程,继承了父进程的文件描述符 ...

  9. Linux进程间通信之管道

    1,进程间通信 (IPC ) Inter-Process Communication 比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息. 2,linux下IPC机制的分类:管道.信号.共 ...

随机推荐

  1. C#装箱拆箱

    .       装箱和拆箱是一个抽象的概念 2.       装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型        利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类 ...

  2. linux常用的监控命令

    转自:http://www.cnblogs.com/huangxm/p/6278615.html 1.  top 显示所有正在运行而且处于活动状态的实时进程, 而且会定期更新显示结果:它显示了CPU使 ...

  3. background背景透明内容不透明

    .demo{ padding: 25px; background-color:#000000;/* IE6和部分IE7内核的浏览器(如QQ浏览器)下颜色被覆盖 */ background-color: ...

  4. css3 变换 transform(2D)

    一.transform变换 可做拉伸.压缩.旋转.偏移的效果.需加各个浏览器前缀. 二.transform-origin 为transform属性值的基点,默认值为元素的中心位置,即以元素左上角为坐标 ...

  5. (转)每天一个linux命令(50):crontab命令

    场景:在学习Linux环境下自动部署项目时候,可以通过crontab命令设定定时任务,实现服务端项目的自动部署! 前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系 ...

  6. jqthumb.js缩略图插件-让缩略图正常显示而不变形

    插件介绍 项目中有图片的时候,有的宽大于高,有的宽小于高,尤其在做图片列表的时候,经常发现缩略图会有变形的.我们怎样来解决这一问题呢. 方法一:用photoshop来处理缩略图.小的项目还可以,大的项 ...

  7. 从零自学Hadoop(24):Impala相关操作上

    阅读目录 序 数据库相关 表相关 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 ...

  8. 初学 Python(十五)——装饰器

    初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...

  9. JavaScript字符串处理

    字符串处理 1.连接字符串: 1)连接符+: 2)连接赋值+=: 3)连接函concat() 2.查找子串位置indexOf() 1)在指定字符串中是否存在给定的字符串(第一次出现) 2)用法str. ...

  10. 学习jdbc学习笔记

    1.jdbc: java database connection      jdbc规范:是sun公司制定的一套连接操作数据库的接口.      我们必须要用具体的驱动类去连接操作数据库.    每个 ...