无名管道(PIPE)

概念:

      只能用于亲缘关系进程间(fork()诞生的),无名管道一种文件,没有名字,所以只能在亲缘进程中去继承他的描述符。

相关接口:

功能创建无名管道:PIPE
头文件#include <unistd.h>
原型int pipe(int pipefd[2]);
参数pipefd一个至少具有2个 int 型数据的数组,用来存放PIPE的读写描述符
返回值成功0
失败-1

创建无名管道相关代码:

  • 定义一个数组存放PIPE的两个文件描述符:int fd[2];

        其中通过读端fd[0]将数据读入PIPE,通过写端fd[1]将数据写入PIPE

  • 创建一个子进程,他将会继承PIPE的描述符: pid_t   pid=fork();

        pid==0时,是子进程 。pid>0时,是父进程。

以下展示子进程通过PIPE向父进程发送一段数据:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

int main(){
    int fd[2];  //定义两个元素整数数组
    if(pipe(fd)==-1){  //创建无名管道
        perror("pipe err");
        return -1;
    }

    pid_t pid=fork(); //生成进程
    if(pid==0){   //子进程
        char s[32];
        fgets(s,sizeof(s),stdin);
        write(fd[1],s,strlen(s));
    }
    
    if(pid>0){  //父进程
        char buf[32];
        memset(buf,0,sizeof(buf));  //可用bzero(buf,32);替换
        read(fd[0],buf,32);
        printf("from child;%s",buf);
    }

    close(fd[0]);
    close(fd[1]);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值