特点

无名管道是半双工的,也就是说,一个管道要么只能读,要么只能写

只能在有共同祖先的进程间使用(父子进程、兄弟进程、子孙进程等)

fork或者execve调用创建的子进程,继承了父进程的文件描述符

通过man 2 pipe查看

       #include <unistd.h>
int pipe(int pipefd[2]);

打开两个文件描述符,保存在pipefd中,其中pipefd[0]为读端,pipefd[1]为写端

无名管道写入操作不具有原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。

不能使用lseek来定位

如果函数出错,返回值为-1,并设置errno

关闭管道用close函数

如果只有写管道,没有读管道,内核会发送SIFPIPE信号

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h> int main()
{
int pipefd[2] = {0}; if (-1 == pipe(pipefd))
{
fprintf(stderr, "pipe: %d, %s\n", errno, strerror(errno));
exit(1);
} pid_t pid = fork(); if (pid < 0)
{
fprintf(stderr, "fork: %d, %s\n", errno, strerror(errno));
exit(1);
}
if (pid > 0)
{
close(pipefd[0]);
char buf[] = "data from parent programe.";
write(pipefd[1], buf, strlen(buf));
close(pipefd[1]);
}
else
{
close(pipefd[1]);
char buf[60] = {0};
int readlen = read(pipefd[0], buf, 60);
printf("child read length: %d, %s\n", readlen, buf);
close(pipefd[0]);
wait(NULL);
} return 0;
}

管道局限性

  1. 只支持单向数据流
  2. 只能用于亲缘进程之间
  3. 没有名字
  4. 缓冲区有限(管道存在于内存中,创建管道时,分配缓冲区)
  5. 管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等;

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

  1. Linux无名管道通信介绍

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

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

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

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

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

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

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

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

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

  6. linux之无名管道

    1.查看命令: man 2 pipe 2.头文件:#include <unistd.h> 3.函数原型: int pipe(int pipefd[2]); a.pipefd[2] :无名管 ...

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

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

  8. UNIX环境高级编程——无名管道和有名管道

    一.进程间通信 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2 ...

  9. linux有名管道fifo,进程间通信

    命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通 ...

随机推荐

  1. 【转】大数据批处理框架 Spring Batch全面解析

    如今微服务架构讨论的如火如荼.但在企业架构里除了大量的OLTP交易外,还存在海量的批处理交易.在诸如银行的金融机构中,每天有3-4万笔的批处理作业需要处理.针对OLTP,业界有大量的开源框架.优秀的架 ...

  2. 基于百度ai,图灵机器人,Flask 实现的网站语音智能问答

    准备以下模块中的函数 from aip import AipSpeech import time import os import requests APP_ID = '15420654' API_K ...

  3. Vue.js - Day4

    父组件向子组件传值 组件实例定义方式,注意:一定要使用props属性来定义父组件传递过来的数据 <script>   // 创建 Vue 实例,得到 ViewModel   var vm ...

  4. 学习路线 roadmap

    我的学习路线为HTML > CSS > Javsscript:Javascript是前端一切学习的基础.HTML和css一起学习. JavaScript基础: Js基础教程.js内置对象常 ...

  5. tween.js 插件

    1.是什么? jQueryTween是一款轻量级的jQuery补间动画工具库插件.使用jQueryTween可以制作出各种平滑的动画过渡效果.该插件基于tween.js,旨在简化各种补间动画操作,提供 ...

  6. <Android 基础(六)> ActionBar

    介绍 Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用户动作.界面导航等功能.使用ActionBar的好 ...

  7. Android 修改圆形progressBar颜色

    查了半天资料,没查到怎样修改progressBar的方法,全都是重新写个ProgressBar,其实很简单在只要一句xml里一句化就可以 android:indeterminateTint=" ...

  8. Azure 6 月新公布

    Azure 6 月新发布:磁盘加密预览版 , CDN 用户上传 HTTPS 自有证书及价格调整. Azure 磁盘加密预览版现已在中国发布 Azure 磁盘加密预览版已对 Azure 中国云地区的 W ...

  9. IIS 发表web 之后,访问注册表项失败得问题

    错误: 对注册表项“HKEY_LOCAL_MACHINE\SOFTWARE\xx\xxxx\xxxxx”的访问被拒绝. 解决办法: 打开IIS,找到应用程序池,然后找到自己web使用得程序池,右键高级 ...

  10. 类型信息(RTTI和反射)——反射

    运行时类型信息可以让你在程序运行时发现和使用类型信息. 在Java中运行时识别对象和类的信息有两种方式:传统的RTTI,以及反射.下面就来说说反射. 重点说说通过反射获取方法以及调用方法,即类方法提取 ...