zoukankan      html  css  js  c++  java
  • pipe 规格严格

    管道在unix类系统中是一个很重要的概念,文件的重定向就是使用管道来实现的,在shell中也提供了"|"来直接使用管道,那么在C中,如何使用管道呢?

    管道在unix中是通过pipe函数来实现的。

    头文件: #include <unistd.h>
    函数定义:int pipe(int filedes[2]);
    函数说明:
    函数返回文件描述符,其中filedes[0]为管道的写入端,filedes[1]为管道的读取端


    函数实例(一)pipe的简单使用:
    #include <unistd.h>
    #include <stdio.h>

    int main( void )
    {
    int filedes[2];
    char buf[80];
    pid_t pid;

    pipe( filedes );

    if ( (pid=fork()) > 0 )
    {
    printf( "This is in the father process,here write a string to the pipe.\n" );
    char s[] = "Hello world , this is write by pipe.\n";
    write( filedes[1], s, sizeof(s) );
    close( filedes[0] );
    close( filedes[1] );
    }
    else
    {
    printf( "This is in the child process,here read a string from the pipe.\n" );
    read( filedes[0], buf, sizeof(buf) );
    printf( "%s\n", buf );
    close( filedes[0] );
    close( filedes[1] );
    }

    waitpid( pid, NULL, 0 );

    return 0;
    }

    函数输出结果:

    This is in the child process,here read a string from the pipe.
    This is in the father process,here write a string to the pipe.
    Hello world , this is write by pipe.

    函数实例(二)使用dups文件重定向和父子进程的数据交互:
    在shell命令下输入:
    #cat file | grep "string"
    grep 命令将使用cat命令的输出作为自己的输入,这个就是简单的用管道实现文件重定向的例子。
    为了实现父子进程间的管道,我们需要将父进程的标准输出重定向到管道的输入端,将子进程的标准输入重定向到管道的标准输出端,这样父进程的输出就可以作为子进程的输入来使用了。

    实现文件重定向:
    只需要将管道的输入端(输出端)复制到文件描述符0(1)即可

      dup2(fd1, 0);   /* 复制fd1到文件描述符0中,更改标准输入为fd1,这里fd1应为管道的输入端 */

      dup2(fd2, 1);   /* 复制fd2到文件描述符1中,更改标准输出为fd2,这里fd2应为管道的输出端 */

      dup2(fd3, 2);   /* 复制fd3到文件描述符2中,更改标准错误输出为fd3 */

    看一个例子:

    #include <unistd.h>
    #include <stdio.h>
    int main()
    {
    int fildes[2];
    pid_t pid;
    int i, j;
    char buf[256];
    if (pipe(fildes) < 0 || (pid = fork()) < 0) /* 创建管道和子进程 */
    {
    fprintf(stderr, "error!n");
    return 1;
    }
    if (pid == 0)

        {
    close(fildes[1]);                  
    dup2(fildes[0], 0);                
    close(fildes[0]);
    gets(buf);                        
    fprintf(stderr, "child:[%s]n", buf);
    return 2;
    }
    close(fildes[0]);
    dup2(fildes[1], 1);                  
    close(fildes[1]);
    puts("Hello!");                       
    return 0;                          
    }

    在上例中,父进程的输出被重定向到管道输入端,子进程从管道的输出端读数据。
  • 相关阅读:
    Spark SQL 编程API入门系列之SparkSQL数据源
    [转]Window2008站点安全设置,IIS7/IIS7.5中目录执行权限的设置方法
    [转]c# 对密码执行散列和 salt 运算方法
    [转]C#使用 Salt + Hash 来为密码加密
    [转]webservice 采用SSL实现加密传输
    [转]如何借助 TLS/SSL 确保套接字连接的安全(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)
    [转]网银在线支付接口和应用
    [转]支付宝接口程序、文档及解读(ASP.NET)
    [转]加盐hash保存密码的正确方式
    [转]如何安全的存储密码
  • 原文地址:https://www.cnblogs.com/diyunpeng/p/1648174.html
Copyright © 2011-2022 走看看