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

    在深度学习中,如果我们已经定义了网络,输入,以及输出,那么接下来就是损失函数,优化策略,以及一般由框架完成的BP反传.这篇博文我们主要探讨一下深度的BP反传算法(以梯度下降为例),尤其是mini_ba ...

  2. DoesNotExist at /account/

    DoesNotExist at /account/ User has no account. Request Method: GET Request URL: http://127.0.0.1:800 ...

  3. 详解EBS接口开发之库存事务处理采购接收和退货

    (一)接收&退货常用标准表简介 1.1   常用标准表 如下表中列出了与采购接收&退货导入相关的表和说明: 表名 说明 其他信息 RCV_TRANSACTIONS 采购接收事务表 事务 ...

  4. 通过JNDI从服务器容器中获取资源_Spring JNDI+Mysql+Tomcat

    通过JNDI从服务器容器中获取DataSource资源 (由容器管理,不要关闭它,容器自己会处理)上一篇我们使用的是dbcp,这里使用JNDI: 使用JNDI连接数据: 在Spring可以注释 < ...

  5. 21 PagerTabStrip-PagerTitleStrip-viewPager

    PagerTabStrip:可以点击跳转到对应viewPager界面 PagerTitleStrip:不可点击 在eclipse开发时如果目标版本为API23那么会有不显示的问题 解决:更换v4包 解 ...

  6. Spark-1.6.0中的Sort Based Shuffle源码解读

    从Spark-1.2.0开始,Spark的Shuffle由Hash Based Shuffle升级成了Sort Based Shuffle.即Spark.shuffle.manager从Hash换成了 ...

  7. iOS开发之自己封装的提示框(警告框)样式BHAlertView

    最近需要使用到提示框(警告框)进行信息的展示和提醒,所以进行了一个类的封装,想用Swift调用此OC文件,但是发现有些困难,所以暂时先把OC代码进行展示,随后再好好研究一下在Swift中的使用. 对于 ...

  8. 【一天一道Leetcode】#190.Reverse Bits

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 我的个人博客已创建,欢迎大家持续关注! 一天一道le ...

  9. Java在Linux下 不能处理图形的解决办法 Can't connect to X11 window server

    java在图形处理时调用了本地的图形处理库.在利用Java作图形处理(比如:图片缩放,图片签名,生成报表)时,如果运行在windows上不会出问题.如果将程序移植到Linux/Unix上的时候有可能出 ...

  10. [django]添加自定义template filter标签

    看文档templatetag 直接放在app下的templatetag 文件夹下就好,这里想放到一个公共的目录下,然后写下简单的自定义tag的模板. django1.6 创建 在项目目录下建立如下的文 ...