管道:当从一个进程连接数据流到另一个进程时,使用术语管道(pipe)。
# include <unistd.h>

int pipe(int filedes[2]); //创建管道

pipe()说明:

返回值:0成功,-1出错。

如果调用成功,则进程此时由了两个额外的打开文件描述符,filedes[0]中的值是管道的读取端,而filedes[1]是管道的写入端。
#include<unistd.h>

#include<sys/types.h>

#include<errno.h>

#include<stdio.h>

#include<stdlib.h>
int main(){

int pipe_fd[2];

pid_t pid;

char buf_r[100];

char *p_wbuf;

int r_num;
    memset(buf_r,0,sizeof(buf_r));
    //创建管道

if(pipe(pipe_fd)<0){

printf("pipe create error/n");

return -1;

}
    if((pid=fork())==0){

//表示在子进程中

printf("/n");

//关闭管道写描述符,进行管道读操作

close(pipe_fd[1]);

sleep(2);

//管道描述符中读取

if((r_num=read(pipe_fd[0],buf_r,100))>0){

printf("%d numbers read from the pipe is %s/n",r_num,buf_r);

}

close(pipe_fd[0]);

exit(0);

}

else if(pid>0){

//表示在父进程中,父进程写

//关闭管道读描述符,进行管道写操作

close(pipe_fd[0]);

if(write(pipe_fd[1],"Hello",5)!=-1)

printf("parent write1 success!/n");

if(write(pipe_fd[1],"Pipe",5)!=1)

printf("parent write2 success!/n");

close(pipe_fd[1]);

sleep(3);

waitpid(pid,NULL,0);

exit(0);

}

}

管道读写注意事项: 1.必须在系统调用fork()中调用pipe(),否则子进程将不会继承文件描述符; 2.当使用半双工管道时,任何关联的进程都必须共享一个相关的祖先进程。

转载声明: 本文转自 http://hi.baidu.com/glowzrf/blog/item/2e3edd17ed23b8044b90a70e.html

======================================================================

扩展参考:

命名管道FIFO——Linux笔记

http://hi.baidu.com/glowzrf/blog/item/dcaf96fb28c941136d22eb9f.html

信号——Linux学习笔记

http://hi.baidu.com/glowzrf/blog/item/2828d6ce8a17d63cb700c8e9.html

守护进程——Linux学习笔记

http://hi.baidu.com/glowzrf/blog/item/35fd44949629781bd31b70d7.html

共享内存——Linux学习笔记

http://hi.baidu.com/glowzrf/blog/item/9a2e97e7e9f1272bb938208d.html

Linux学习笔记——管道PIPE的更多相关文章

  1. linux 学习笔记 管道 pipe ls cp mv

    如ls |less -MN 含义把ls结果输出到less [ls]  ==管道== [more] ls命令 ls -a  展示隐藏的文件 <隐藏文件一般以. 开始> ls -t 以时间戳排 ...

  2. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  3. deepin linux学习笔记

    目录 deepin linux学习笔记 前言 linux常用命令 ls 显示文件夹内容 cd 切换当前目录 pwd 查看当前工作目录 mkdir 新建文件夹 rm 删除文件或文件夹 mv 移动文件 c ...

  4. Linux 学习笔记之超详细基础linux命令 Part 12

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 11---------------- ...

  5. Linux 学习笔记之超详细基础linux命令 Part 3

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 2----------------- ...

  6. 91 Testing Linux学习笔记

    91 Testing Linux学习笔记... 学习地址:91Testing 的Linux教程=====================学习网址:http://www.91testing.net/ar ...

  7. (转)Linux最常用指令及快捷键 Linux学习笔记

    Linux最常用指令及快捷键 Linux学习笔记 原文:http://blog.csdn.net/yanghongche/article/details/50827478 [摘自 鸟叔的私房菜]--转 ...

  8. Linux学习笔记(七) 查询系统

    1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...

  9. linux学习笔记2-linux的常用命令

    第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...

随机推荐

  1. pandas 模块

    什么是pandas pandas是一个python的包,主要用来处理表格格式的文件,可以快速的对表格进行查询,过滤,合并等操作. pandas的简单使用 pandas读入table格式文件 #读入一个 ...

  2. 【Oracle】获取SQL执行计划

    一.plsql developer工具F5         在sqldeveloper中选中sql按F5即可查看执行计划         

  3. 部署.Net Core APi+Vue 到 linux centos 服务器(一)

    部署.Net Core APi+Vue 到 linux centos 服务器(一) 前言:项目采用的是 .net core 作为接口,vue作为前端. 此时需要把整个项目架设到linux centos ...

  4. 【简解】C2CRNI - Crni

    [题目大意] 给定一个N行N列的矩阵,每个格子要么为白色要么为黑色.黑矩形为所涵单元格数大于等于2且所涵单元格均为黑色的矩表.要解决的问题是在给定的矩形中找出两个没有共公部分的黑矩形,输出所有方案数, ...

  5. The One day 中位数的计算

    """ 中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / ...

  6. redis 缓存穿透、击穿、雪崩

    缓存穿透: 大量查询 redis 中不存在的key(用随救数进行查询),导致每次都会去查询数据库,造成数据库压力过大(甚至宕机). 解决办法: 1.对我们的 api 接口 进行限流处理.用户授权.黑名 ...

  7. 2019 唯品会java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.唯品会等公司offer,岗位是Java后端开发,因为发展原因最终选择去了唯品会,入职一年时间了,也成为了面试官 ...

  8. Exception和RuntimeException区别

    Exception:强制性要求用户必须进行处理: RuntimeException:是Exception的子类,由用户选择是否进行处理:

  9. 手写MQ框架(一)-准备启程

    一.背景 很久以前写了DAO框架和MVC框架,前段时间又重写了DAO框架-GDAO(手写DAO框架(一)-从“1”开始,源码:https://github.com/shuimutong/gdao.gi ...

  10. js正则表达式(七)

    一.正则表达式对象的创建方法一:使用构造函数的形式: var pattern = new RegExp('正则表达式','修饰符'); var pattern = new RegExp('hello' ...