我是靠谱客的博主 丰富果汁,最近开发中收集的这篇文章主要介绍Linux系统编程2:匿名管道pipe,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

pipe函数
匿名管道,用于有血缘关系之间进程的通信
调用pipe()函在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端和写端,然后通过参数传出给用户程序两个文件描述符,fd[0]指向管道的读端,fd[1]指向管道的写端。所以管道在用户程序看起来像一个打开的文件。通过read(fd[0])或者writefd[1]向这两个文件读写数据其实时在读写内核缓冲区。pipe函数成功返回0 调用失败返回-1.

创建管道
int pipe(int pipefd[2]); 成功:0;失败:-1,设置errno
函数调用成功返回r/w两个文件描述符。无需open,但需手动close。规定:fd[0] → r; fd[1] → w,就像0对应标准输入,1对应标准输出一样。向管道文件读写数据其实是在读写内核缓冲区。
管道创建成功以后,创建该管道的进程(父进程)同时掌握着管道的读端和写端。如何实现父子进程间通信呢?通常可以采用如下步骤:
在这里插入图片描述

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int main(void){
    int fd[2];
    char str[1024]="hello world";
    char buf[1024];
    //fd[0]读端,fd[1]写端
    if(pipe(fd)<0){
        perror("pipe");
        exit(1);
    }
    pid_t pid=fork();
    //父写子读
    if(pid>0){//父进程,
        close(fd[0]);
        sleep(2);
        write(fd[1],str,strlen(str));
        wait(NULL);
    }else if(pid==0){
        //子进程里子进程关闭写端
        close(fd[1]);
        int len;
        //read返回值 读到字节的返回值长度
        len=read(fd[0],buf,sizeof(buf));
        write(STDOUT_FILENO,buf,len);
    }else{//调用失败
        perror("fork");
        exit(1);
    }
    return 0;
}

注意事项:
写端关闭,写端无数据,读端读完管道数据时,再次读,返回0 相当读到EOF。
写端未关闭,写端暂时无数据,读端读完管道中的数据时,再次读,阻塞。
读端关闭,写端写满数据,产生SIGPIPE信号,导致写进程终止。
读端没去读管道数据,当写端写满管道后,再次写,阻塞。

最后

以上就是丰富果汁为你收集整理的Linux系统编程2:匿名管道pipe的全部内容,希望文章能够帮你解决Linux系统编程2:匿名管道pipe所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部