zoukankan      html  css  js  c++  java
  • 进程间的管道通信

    管道是进程间通信的一种工具。

    1、管道是半双工的,建立管道后,只能由一个进程向另一个进程传数据。

    2、管道只能在有公共祖先的两个进程之间使用。父进程建立管道后,fork,这个管道就能在父子进程之间调用了。

    管道通过pipe函数创建。

    pipe(int fd[2]);

    要打开两个文件,文件描述符放在fd里面。写数据时往fd1里面写,读数据时从fd0里面读。

    如果是父进程往子进程传数据,父进程的fd0关闭,写进fd1里面去。子进程的fd1关闭,从fd0里面读数据。

    #include<unistd.h>
    #include <fcntl.h>
    #include<memory.h>
    
    int main(){
    
        int fd[2];
    
        fd[0] = open("file0.txt",O_RDWR);
        fd[1] = open("file1.txt",O_RDWR);
    
        pipe(fd);
        
    
        pid_t pid;
        char buf[256];
        
    
        pid = fork();//create child process
    
        if(pid<0){
            
            printf("fork error
    ");
    
        }
        else if(pid>0){
            
            
            memset(buf,'',256);
            close(fd[0]);
            write(fd[1],"from parent:Hello!
    ",20);
            printf("In parent process and pid is %d
    ",pid);
            
            
            
        
        }
        else{
    
            printf("In child process and pid is %d
    ",pid);
            close(fd[1]);
            read(fd[0],buf,256);
            printf("%s
    ",buf);
            
    
        }
    
    
    
    
    
    
    
    
    
    
    }

    如果是子进程往父进程传数据,子进程的fd0关闭,写进fd1里面去。父进程的fd1关闭,从fd0里面读数据。

    #include<unistd.h>
    #include <fcntl.h>
    #include<memory.h>
    
    int main(){
    
        int fd[2];
    
        fd[0] = open("file0.txt",O_RDWR);
        fd[1] = open("file1.txt",O_RDWR);
    
        pipe(fd);
        
    
        pid_t pid;
        char buf[256];
        
    
        pid = fork();//create child process
    
        if(pid<0){
            
            printf("fork error
    ");
    
        }
        else if(pid>0){
            
            printf("In parent process and pid is %d
    ",pid);
            close(fd[1]);
            read(fd[0],buf,256);
            printf("%s
    ",buf);
            
            
        
        }
        else{
    
            
    
            memset(buf,'',256);
            close(fd[0]);
            write(fd[1],"from child:Hi!
    ",15);
            printf("In child process and pid is %d
    ",pid);
            
    
        }
    
    
    
    
    
    
    
    
    
    
    }

    同时,打开的两个文件file1.txt 和 file0.txt里面根本木有东西残留的,只是拿去当管道而已,并没有写入文件里面去。

  • 相关阅读:
    特别记录:OMNET神坑
    OMNet++运行项目后,出现错误:out/clang-release//DynaPacket_m.o:(.text+0x1296): 跟着更多未定义的参考到 _Unwind_Resume
    【2021年1月4日】与父谈话总结
    Ceph架构和原理
    Mysql的InnoDB存储引擎锁机制
    MySQL 分区表
    MySQL日志之binlog、redo log、undo log
    PTA刷题记录
    [POI2015]MYJ
    Manacher初步
  • 原文地址:https://www.cnblogs.com/wzben/p/5432797.html
Copyright © 2011-2022 走看看