Linux C编程 使用pipe管道进程间通信,详细注释

管道作用于有血缘关系的进程之间,通过fork来传递

调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个 写端,然后通过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读 端,filedes[1]指向管道的写端(很好记,就像0是标准输入1是标准输出一样)。

所以管道 在用户程序看起来就像一个打开的文件,通过read(filedes[0]);或者write(filedes[1]);向这个文件读写数据其实是在读写内核缓冲区。

pipe函数调用成功返回0,调用失败返 回-1。

//调用pipe函数时在内核中开辟一块缓冲区(称为管道)用于通信,
//它有一个读端一个 写端,然后通过filedes参数传出给用户程
//序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指
//向管道的写端
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    int fd[2];
    pid_t tid;
    char buf[1024]; //用来当做一个缓冲区
    int ifp;

    ifp = pipe(fd); //创建一个pipe管道
    if(ifp == -1){   //判读是否创建成功,(pipe成功返回 0 失败返回 -1)
        printf("error 18行\n");
        exit(1);
    }

    tid = fork();
    if(tid == -1){   //判读子进程是否创建成功
        printf("子进程没有创建成功,在24行\n");
        exit(1);
    }else if(tid > 0){ //如果tid大于0 那么这个就是父进程
        //父进程执行以下代码
        close(fd[1]);  //父进程关闭写端
        read(fd[0], buf, sizeof(buf));  //从管道的读端读取内容 存放到buf变量里面
        printf("这是父进程读到的内容: %s\n",buf); //将读到内容 打印出来
    }else if(tid == 0){ //如果tid等于0, 那么这个进程就是子进程
        sleep(2);//首先睡眠两秒 等待父进程就绪
        close(fd[0]);  //子进程关闭读端
        write(fd[1], "www.zploo.com", sizeof("www.zploo.com"));
    }
    return 0;
}

 

暂无评论

发表评论