• 管道的简单应用


    /**
     * 父进程写入子进程读取
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>
    
    int main()
    {
            int mypipe[2];
            //创建管道
            if(pipe(mypipe) < 0){
                    perror("create pipe error");
                    exit(1);
            }
            pid_t pid;
            if((pid = fork()) < 0){
                    perror("fork error");
                    exit(2);
            }
            //parent process
            if(pid > 0){
                    close(mypipe[0]);
                    //...
                    int start = 1, end = 10000;
    
    /*
                    if(write(mypipe[1], &start, sizeof(start)) != sizeof(int)){
                            perror("write error");
                            exit(3);
                    }
                    if(write(mypipe[1], &end, sizeof(end)) != sizeof(int)){
                            perror("write error");
                            exit(3);
                    }
    */
    
                    FILE *fp = fdopen(mypipe[1], "wb");
                    int ret = fprintf(fp, "%d,%d", start, end);
                    printf("ret=%d
    ", ret);
                    fclose(fp);
    
                    wait((void *)0);
                    close(mypipe[1]);
            }else{
                    close(mypipe[1]);
                    //...
    
                    int start = 0, end = 0;
    
                    /*
                    if(read(mypipe[0], &start, sizeof(int)) < 0){
                            perror("read error");
                            exit(4);
                    }
                    if(read(mypipe[0], &end, sizeof(int)) < 0){
                            perror("read error");
                            exit(4);
                    }
                    */
    
                    FILE *fp = fdopen(mypipe[0], "rb");
                    int ret = fscanf(fp, "%d,%d", &start, &end);
                    printf("ret=%d
    ", ret);
                    fclose(fp);
    
                    fprintf(stderr, "start=%d, end=%d
    ", start, end);
                    close(mypipe[0]);
            }
            return 0;
    }
    /**
     * 一个子进程读取文件,一个子进程grep
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>
    
    char *cmd1[3] = {
            "/bin/cat", "/etc/passwd", NULL
    };
    char *cmd2[4] = {
            "/bin/grep", "root", "--color", NULL
    };
    
    int main()
    {
            int mypipe[2];
            if(pipe(mypipe) < 0){
                    perror("pipe error");
                    exit(1);
            }
            int i = 0;
            pid_t pid;
            for(; i < 2; i++){
                    pid = fork();
                    if(pid < 0){
                            perror("fork error");
                            exit(1);
                    }else if(pid > 0){
                            if(i == 1){
                                    close(mypipe[0]);
                                    close(mypipe[1]);
                                    wait(0);
                                    wait(0);
                            }
                    }else{
                            if(i == 0){
                                    /**
                                     * cat 默认将数据写入标准输出,所以可以将标准输出重定向到管道
                                     */
                                    close(mypipe[0]);
                                    if(dup2(mypipe[1], STDOUT_FILENO) 
                                                                            != STDOUT_FILENO){
                                            perror("dup2 STDOUT_FILENO error");
                                            exit(1);
                                    }
                                    close(mypipe[1]);
                                    if(execvp(cmd1[0], cmd1)){
                                            perror("execvp error");
                                            exit(1);
                                    }
                            }else{
                                    /**
                                     * grep 默认是从标准输入读取
                                     */
                                    close(mypipe[1]);
                                    if(dup2(mypipe[0], STDIN_FILENO) 
                                                                            != STDIN_FILENO){
                                            perror("dup2 STDIN_FILENO error");
                                            exit(1);
                                    }
                                    close(mypipe[0]);
                                    if(execvp(cmd2[0], cmd2)){
                                            perror("execvp error");
                                            exit(1);
                                    }
                            }
                    }
            }
            return 0;
    }

    协同程序

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>
    
    int main(){
            int fda[2], fdb[2];
            if(pipe(fda) < 0){
                    perror("pipe fda error");
                    exit(1);
            }
            if(pipe(fdb) < 0){
                    perror("pipe fdb error");
                    exit(1);
            }
            pid_t pid;
            pid = fork();
            if(pid < 0){
                    perror("fork error");
                    exit(1);
            }
            if(pid > 0){
                    /**
                     * 1、父进程从标准输入读取x、y
                     * 2、将x、y写入管道a
                     * 3、从管道b读取计算的结果
                     */
                    close(fda[0]);
                    close(fdb[1]);
                    int a, b, ret;
                    fprintf(stderr, "Please input a,b:
    ");
                    fscanf(stdin, "%d,%d", &a, &b);
                    if(write(fda[1], &a, sizeof(int)) != sizeof(int)){
                            perror("write error");
                            exit(1);
                    }
                    if(write(fda[1], &b, sizeof(int)) < sizeof(int)){
                            perror("write error");
                            exit(1);
                    }
                    if(read(fdb[0], &ret, sizeof(int)) < 0){
                            perror("read error");
                            exit(1);
                    }
                    printf("ret = %d
    ", ret);
                    close(fda[1]);
                    close(fdb[0]);
                    wait(0);
            }else{
                    /**
                     * 1、子进程负责从管道a中读取父进程写入的x、y
                     * 2、通过exec调用add进行计算
                     * 3、将计算结果写入b
                     */
                    //fda:read,fdb:写
                    close(fda[1]);
                    close(fdb[0]);
    
                    if(dup2(fda[0], STDIN_FILENO) != STDIN_FILENO){
                            perror("dup2 error");
                            exit(1);
                    }
                    if(dup2(fdb[1], STDOUT_FILENO) != STDOUT_FILENO){
                            perror("dup2 error");
                            exit(1);
                    }
                    char *cmd[] = {
                            "/root/unix/wangyi/src/ipc/collaborative/add", 
                            "/root/unix/wangyi/src/ipc/collaborative/add", NULL
                    };
                    if(execvp(cmd[0], cmd) < 0){
                            perror("execvp error");
                            exit(1);
                    }
    
                    close(fda[0]);
                    close(fdb[1]);
            }
            return 0;
    }
  • 相关阅读:
    github中,一些涉及到用户配置的文件怎么处理(比如数据库用户名/密码)?
    XMLHttpRequest cannot load file浏览器无法异步加载本地file文件
    HTML小技巧
    HTML实体符号代码速查表
    宽度不固定,水平居中
    CSS实现背景透明,文字不透明
    window.inner 兼容IE8
    div横排放置对齐问题;block,inline,inline-block区别
    IE兼容CSS3圆角border-radius的方法(同时兼容box-shadow,text-shadow)
    js 值和引用
  • 原文地址:https://www.cnblogs.com/bai-jimmy/p/6259895.html
Copyright © 2020-2023  润新知