进程间的管道通信

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

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\n");

    }
    else if(pid>0){
        
        
        memset(buf,'\0',256);
        close(fd[0]);
        write(fd[1],"from parent:Hello!\n",20);
        printf("In parent process and pid is %d\n",pid);
        
        
        
    
    }
    else{

        printf("In child process and pid is %d\n",pid);
        close(fd[1]);
        read(fd[0],buf,256);
        printf("%s\n",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\n");

    }
    else if(pid>0){
        
        printf("In parent process and pid is %d\n",pid);
        close(fd[1]);
        read(fd[0],buf,256);
        printf("%s\n",buf);
        
        
    
    }
    else{

        

        memset(buf,'\0',256);
        close(fd[0]);
        write(fd[1],"from child:Hi!\n",15);
        printf("In child process and pid is %d\n",pid);
        

    }










}

 

 

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

 

posted @ 2016-04-25 21:23  wzb的QQ空间  阅读(414)  评论(0编辑  收藏  举报