/*管道
  可以把管道想象为两个实体之间的单向连接器。注意,管道是半双工的,
  如果需要全双工通讯,应该转而考虑套接字。
  匿名管道又称管道,提供了一个进程与它的兄弟进程通讯的方法,只存在于父进程中;
  命名管道,可以存在与文件系统中,任意进程都可找到它,使得不同先祖的进程也可以通讯。
  #include <unistd.h>
  int pipe( int dfs[ 2 ] );创建匿名管道
  int dup(int oldfd );创建一个文件描述符的副本
  int dup2(int oldfd, int targetfd);
  dup/dup2提供了复制文件描述符的功能。他们常用于stdin(0)、stdout(1)、stderr(2)的重定向;
  #include <sys/types.h>
  #include <sys/stat.h>
  int mkfifo(const char* pathname,mode_t mode  );创建一个命名管道
  记住:管道只不过是一对文件描述符因此所有能够操作文件描述符的函数都可用于管道。这些函数
  包括但不限于select,read,write,fcntl,freopen。
 */
/**********1、简单匿名管道应用************/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define MAX_LINE 80
#define PIPE_STDIN 0
#define PIPE_STDOUT 1
/*
  myPipe[ 1 ]向管道写入数据;myPipe[ 0 ]从管道读取数据。
 */
int main(  )
    {
        const char* string={"A simple message."};
        int ret,myPipe[ 2 ];
        char buffer[ MAX_LINE+1 ];
        //create the pipe
        ret=pipe( myPipe );   //pipe(  )创建一个匿名管道
        if( ret==0 )
            {
                //write the message into the pipe
                write( myPipe[ PIPE_STDOUT ],string,strlen( string ) );
                //read the message from the pipe
                ret=read( myPipe[ PIPE_STDIN ],buffer,MAX_LINE );
                //NULL terminate the string
                buffer[ ret ]=0;
                printf( "%s/n",buffer );

            }
        close( thePipe[ 0 ] );
        close( thePipe[ 1 ] );

        return 0;
    }

//父子进程间利用管道通讯实例
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <wait.h>
#define MAX_LINE 80
int main(  )
    {
        int thePipe[ 2 ],ret;
        char buf[ MAX_LINE+1 ];
        const char* testbuf={"a test string."};
        if( pipe( thePipe )==0 )
            {
                if( fork(  )==0 )
                    {
                        printf( "You have enter the child process/n" );
                        ret=read( thePipe[ 0 ],buf,MAX_LINE );
                        buf[ ret ]=0;
                        printf( "Child read info: %s/n",buf );

                    }
                else
                    {
                        ret=write( thePipe[ 1 ],testbuf,strlen( testbuf ) );
                        ret=wait( NULL );

                    }
            }
        close( thePipe[ 0 ] );
        close( thePipe[ 1 ] );

        return 0;

    }
/*值得注意的是:
  把子进程的输出重定向到管道的输入,父进程的输入重定向到管道的输出。
  --这是一个很值得记住的有用技术
 */
//使用C实现管道链接
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(  )
    {
        int pfds[ 2 ];
        if( pipe( pfds )==0 )
            {
                if( fork(  )==0 )
                    {
                        close( 1 );
                        dup2( pfds[ 1 ],1 );
                        close( pfds[ 0 ] );
                        execlp( "ls","ls","-l",NULL );

                    }
                else
                    {
                        close( 0 );
                        dup2( pfds[ 0 ],0 );
                        close( pfds[ 1 ] );
                        execlp( "wc","wc","-l",NULL );

                    }
            }
        return 0;

    }

Linux管道编程实例的更多相关文章

  1. linux内核模块编程实例

    linux内核模块编程实例 学号:201400814125 班级:计科141 姓名:刘建伟 1.确定本机虚拟机中的Ubuntu下Linux的版本 通过使用命令uname -a/uname -r/una ...

  2. Linux c编程实例_例子

    例一:字符与整型变量的实现 #include <stdio.h> int main() { int c1,c2; char c3; c1='a'-'A'; c2='b'-'B'; c3=; ...

  3. Linux多线程编程实例解析

    Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...

  4. Linux网络编程实例解析

    **************************************************************************************************** ...

  5. linux 定时器编程实例(完善中).....

    最近在写linux 下的定时器编程实验,测试发现 usleep函数在 x86 架构下的定时还是比较准确的,在arm9下 就不太准了. 今天用linux 下的setitimer()函数进行了定时 器的测 ...

  6. Linux文件编程实例

    //捕获fopen调用中的错误 #include <stdio.h> #include <errno.h> #include <string.h> #define  ...

  7. Linux多进程编程实例

    前言:编写多进程程序时,我们应该了解一下,创建一个子进程时,操作系统内核是怎样做的.当通过fork函数创建新的子进程时,内核将父进程的用户地址空间的内容复制给子进程,这样父子进程拥有各自独立的用户空间 ...

  8. Linux 多线程编程实例

    一.多线程 VS 多进程 和进程相比,线程有很多优势.在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护代码段和数据.而运行于一个进程中的多个线程,他们之间使用相同 ...

  9. linux socket编程实例

    /* ============================================================================ Name : client.c Auth ...

随机推荐

  1. JavaScript的事件、DOM模型、事件流模型以及内置对象详解(三)

    JS中的事件 JS中的事件分类 1.鼠标事件: click/dbclick/mouseover/mouseout 2.HTML事件: onload/onunload/onsubmit/onresize ...

  2. 整理的Java List Set Map是否有序,元素是否允许重复

    整理的Java List Set Map是否有序,元素是否允许重复的说明,如下图:

  3. Ajax PHP JavaScript MySQL实现简易的无刷新在线聊天室

    思路 消息显示区 发消息 板块 消息显示 消息发送 优化 显示非重复性的数据 优化显示 加上滚动条 每次都显示最新消息 完整代码 前端代码 数据库表结构 服务器端代码 总结与展望 总结 展望 为更好的 ...

  4. clang-format中文出错

    clang-format中文出错(金庆的专栏)VS2015 Community + clang-format(Visual Studio plugin installer, based on SVN ...

  5. 【Java二十周年】Delphi转行java的一些小感触

    本文纯属一届小码农对java使用过程的体验感触 目录: 初遇java编程语言 与java的擦肩 深入java 跨平台性 开源支持 web的支撑 初遇java编程语言 刚上大学的时候,完全是个电脑盲.刚 ...

  6. 根据ccid取得账户,更改某段值再创建账户,返回新的ccid

    CREATE OR REPLACE PACKAGE cux_cuxaprebate_utl IS * =============================================== * ...

  7. CVS简介

    CVS - Concurrent Versions System(并发版本管理系统)是一个版本控制管理系统,它是SVN出现之前最为广泛使用的一个版本控制系统. CVS的优点就不多说了,总之没有它,早期 ...

  8. 一个都不能少: DevOps的3大核心基础架构

    DevOps的涵盖面非常广,因为这个概念的火热,又有很多文章和技术都在把DevOps的帽子扣在自己头上,让很多人迷惑不解.其实,DevOps的知识体系如果从顶层上来分解,只有2块:方法论和工具链.方法 ...

  9. 根据iOS 10 的新特性,创建iMessage App,可用于自定义表情

    第一. 介绍(原文作者 澳大利亚19岁少年--Davis Allie ----原文地址) 随着iOS10的发布,苹果对开发者开放了Messages应用程序,开发人员现在可以创建他们自己的各种类型 并且 ...

  10. arm-linux内核编译过程小结

    记在前面的杂七杂八 内核的生成,实际上最终的目的是生成一个binary文件zImage,大小2-5MB的数量级. 用户可以从kernel.org得到的tar.gz格式的内核源代码,此代码解压后,就会生 ...