/*管道
  可以把管道想象为两个实体之间的单向连接器。注意,管道是半双工的,
  如果需要全双工通讯,应该转而考虑套接字。
  匿名管道又称管道,提供了一个进程与它的兄弟进程通讯的方法,只存在于父进程中;
  命名管道,可以存在与文件系统中,任意进程都可找到它,使得不同先祖的进程也可以通讯。
  #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. MacOS下Rails+Nginx+SSL环境的搭建(下)

    五.以Production环境部署Rails项目 这里插一个题外话,我们之前是以development环境运行的rails项目,现在我们希望在实际的生产系统中跑一下看看.这是十分有必要的,应该在rai ...

  2. Errors occurred during the build. Errors running builder 'JavaScript Validator' on project '项目名'.

    把JavaScript Validator去掉.去掉的方法是:选择一个项目--右键Properties--Builders(排第二)--点一下右侧会有四项--取消第一项"JavaScript ...

  3. leetcode之Largest Rectangle in Histogram

    问题来源:Largest Rectangle in Histogram 问题描述:给定一个长度为n的直方图,我们可以在直方图高低不同的长方形之间画一个更大的长方形,求该长方形的最大面积.例如,给定下述 ...

  4. 使用eclipse开发工具与hibernate开发者为开源一起做贡献

    本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/50525363 hibernate使用的是gradle自动构建工具, ...

  5. PGM:部分观测数据

    http://blog.csdn.net/pipisorry/article/details/52599451 基础知识 数据缺失的三种情形: 数据的似然和观测模型 Note: MLE中是将联合概率P ...

  6. uboot-tiny4412启动流程(下)----如何将自己的裸板测试程序加入uboot中启动测试

    今天在工作上搞了一天高通的芯片uboot程序,目的是希望将一个裸板的程序移植到uboot中,并且开机让它运行.这个芯片是NXP4330,目前是高通的一个芯片,基于ARM-contexA9架构,那么就跟 ...

  7. Hexo 简明教程

    概述 对于个人独立博客的搭建,或者一些产品网站的介绍我个人比较推崇直接用静态网站生成器来完成这个事情,对于,静态网页部署方便,浏览速度快. 以下为部分静态网站生成器简要列表: Ruby Jekyll ...

  8. java解决Url带中文参数乱码问题

    首先打开Tomcat安装目录,打开conf文件,打开server.xml,找到这段代码: <Connector port="8080" protocol="HTTP ...

  9. Java基本语法-----java流程控制语句

    1顺序语句 语句:使用分号分隔的代码称作为一个语句. 注意:没有写任何代码只是一个分号的时候,也是一条语句,称作空语句. 顺序语句就是按照从上往下的顺序执行的语句. 2判断(if-else) 在我们找 ...

  10. XML之SAX解析模型

    DOM解析会把整个XML文件全部映射成Document里的树形结构,当遇到比较大的文件时,它的内存占用很大,查找很慢 SAX就是针对这种情况出现的解决方案,SAX解析器会从XML文件的起始位置起进行解 ...