美文网首页
Linux进程之间的通信-管道(pipe)

Linux进程之间的通信-管道(pipe)

作者: 快扶我起来搬砖 | 来源:发表于2018-09-11 16:08 被阅读0次

    本文由于作者的失误造成了对管道学习的误解,现已更正

    进程之间的通信

    进程之间的通信包括`管道`、`命名管道`、`消息队列`、`信号量`、`共享内存`。
    
    管道的工作方式为半双工(即管道工作时,只有一个端可以进行工作、只能读或者写,不能同时写和读)。
    
    img
    两个管道的组合可以实现一个全双工的一个工作方式(可以进行进程之间的通信)。
    
    img
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <string.h>
    #include <sys/wait.h>
    
    /*读操作*/
    void read_to_pipe(int fd){
        char message[100];
        read(fd, message, 100);
        printf("read from pipe :%s\n", message);
    }
    /*写操作*/
    void write_to_pipe(int fd){
        char message[1000];
        peintf("Input your message!\n");
        scanf("%s", message);
        write(fd, message, strlen(message)+1);
    }
    
    int main(void){
        int fd[2];
        pid_t pid;
        int stat_val;
    
        /*创建一个管道*/
        if(pipe (fd)){
            printf("Create process failed!\n");
            exit(1);
        }
    
        /*fork在创建管道之后,因为在fork在前父子进程继承的不一样*/
        pid = fork();
    
        if(pid < 0){
            printf("Pid is error.\n");
            exit(1);
        }else if(pid == 0){
            close(fd[1]);
            read_to_pipe(fd[0]);
        }else if(pid > 0){
            close(fd[0]);
            write_to_pipe(fd[1]);
            wait(&stat_val);
            exit(0);
        }
    
        return 0;
    }
    
    两个管道实现的全双工对于我们的一个进程之间的通信很重要。
    
    /*两个进程使用两个管道最终形成了进程之间的通信*/
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <string.h>
    #include <sys/wait.h>
    
    void child_rw_pipe(int readfd, int writefd){
        char *message = "This is the message1, from child";
        write(writefd, message, strlen(message)+1);
        
        char message2[100];
        read(readfd, message2, 100);
        printf("Child read the message :%s \n", message2);
    }
    void parent_rw_pipe(int readfd, int writefd){
        char *message = "This is the message2, from parent";
        write(writefd, message, strlen(message)+1);
        
        char message2[100];
        read(readfd, message2, 100);
        printf("parent read the message :%s \n", message2);
    }
    int main(void){
        int pipe1[2], pipe2[2];
        pid_t pid;
        int stat_val;
    
        printf("realize full-duplex communication.\n");
        /*创建一个管道*/
        if(pipe(pipe1)){
            printf("Create pipe1 failed!\n");
            exit(1);
        }
        if(pipe(pipe2)){
            printf("Create pipe2 failed!\n");
            exit(1);
        }
    
        pid = fork();
    
        if(pid < 0){
            printf("Pid is error.\n");
            exit(1);
        }else if(pid == 0){
            close(pipe1[1]);
            close(pipe2[0]);
            child_rw_pipe(pipe1[0], pipe2[1]);
        }else if(pid > 0){
            close(pipe1[0]);
            close(pipe2[1]);
            parent_rw_pipe(pipe2[0], pipe1[1]);
            wait(&stat_val);
            exit(0);
        }
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:Linux进程之间的通信-管道(pipe)

          本文链接:https://www.haomeiwen.com/subject/knpugftx.html