zoukankan      html  css  js  c++  java
  • 管道pipe与dup结合使用,应用实例

    管道的一种常见用法:在父进程创建子进程后向子进程传递参数。例如,一个应用软件有一个主进程和很多个不同子进程。

    主进程创建子进程后,在子进程调用exec函数执行一个新程序前,通过管道给即将执行的程序传递命令行参数,子进程根据传来

    的参数进行初始化或其他操作。

    大致思路:

    The child can then exec() another program, which inherits the standard streams.

    父进程关闭 管道读端  close( fd[0] );  调用  dup2(fd[1], STDOUT_FILENO);  将管道的写端重定向到标准输出

    子进程关闭 管道写端 close( fd[1] ); 调用 dup2(fd[0], STDIN_FILENO); exec调用的进程中读取标准输入

    main程序:

    #include <stdio.h>
    #include <unistd.h>
    #include <strings.h>
    #include <string.h>
    #include <stdlib.h>
    
    
    
    int main(int argc, char* argv[], char** environ)
    {
        char* str = "from parent's message";
        int stat;
        pid_t pid;
        int fd[2];
    
        pipe(fd);
    
        pid = fork();
        if(0 == pid)//child read
        {
            close(fd[1]);
            dup2(fd[0], STDIN_FILENO);
            
            execve("myprocess", argv, environ);
    
        }
        else//parent write
        {
    
            close(fd[0]);
            int old = dup(STDOUT_FILENO);
            int new = dup2(fd[1], STDOUT_FILENO);
    
            
            write(fd[1], str, strlen(str)+1);
    
            dup2(old, new);//恢复重定向
    
            wait(&stat);//
            if ( WIFEXITED(stat) )
            {
                printf("child exited with code:%d
    ", WEXITSTATUS(stat));
            }
    
            close(fd[1]);
    
            exit(0);
    
        }
        
    }

    myprocess程序:

    #include <stdio.h>
    #include <unistd.h>
    #include <strings.h>
    #include <string.h>
    #include <stdlib.h>
    
    
    
    int main(int argc, char* argv[])
    {
        printf("myprocess begin
    ");
        char buf[30];
        bzero(buf, sizeof(buf));
    
        read(STDIN_FILENO, buf, sizeof(buf));
    
        printf("recv message:%s
    ", buf);
        
        exit(33);
        
    }

    main程序的执行结果:

    myprocess begin
    recv message:from parent's message
    child exited with code:33

    ------------------------------------------------------------------------

    可见,exec调用的程序获取到了主进程写入管道的数据。

    这在实际项目中是经常用到的,主进程启动多个不同功能的exec调用,并通过管道的方式传递数据给启动的程序。

  • 相关阅读:
    BZOJ4779: [Usaco2017 Open]Bovine Genomics
    USACO比赛题泛刷
    BZOJ1977: [BeiJing2010组队]次小生成树 Tree
    LOJ #10132. 「一本通 4.4 例 3」异象石
    $O(n+log(mod))$求乘法逆元的方法
    BZOJ2226: [Spoj 5971] LCMSum
    数据库 | Redis 缓存雪崩解决方案
    中间件 | 微服务架构
    数据库 | SQL 诊断优化套路包,套路用的对,速度升百倍
    数据库 | SQL语法优化方法及实例详解
  • 原文地址:https://www.cnblogs.com/zhangxuan/p/6709269.html
Copyright © 2011-2022 走看看