Linux多进程 --无名管道

无名管道的创建函数pipe

函数原型:int pipe(int pipefd[2]);
头文件:#include <fcntl.h>	#include <unistd.h>
输入参数:
	pipefd: int型数组,长度为2,用于创建无名管道后存放对无名管道进行读写的文件描述符。
返回值:创建无名管道的结果,0表示成功,-1失败

函数说明

调用pipe函数创建一个无名管道,参数pipefd用于返回无名管道的文件描述符。pipefd[0] 用于存放无名管道读文件描述符,pipefd[1]用于存放无名管道的写文件描述符。向管道中写入的数据将由内核尽心缓存,直到数据从另一端被读出。

无名管道的简介与特点

  1. 无名管道是半双工的,在同一个进程里面,不能同时对同一个无名管道进行读写。
  2. 无名管道只能在有亲缘关系的进程之间使用(比如父进程与子进程)。
  3. 无名管道在使用时,可以被认为是一种特殊的文件,对于它的读写可以使用普通的read和write函数,但无名管道不是普通的文件,并不存在与文件系统中,只存在于内存中。

无名管道的使用

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
int main(void){
    	pid_t pid;
    	int fd[2];///write:fd[1] read:fd[0] 
    	char buf[128];
    	if(pipe(fd)<0){
            	perror("pipe");
            	exit(1);
   		 }
   		pid =fork();
    	if(pid < 0){
           		perror("fork");
            	exit(1);
    	}else if(pid ==0 ){
           		printf("child.....\n");
            	while(1){
                    	bzero(buf,128);
                   		printf("child wait input:");
                    	fgets(buf,128,stdin);
                    	write(fd[1],buf,strlen(buf));
            	}
            	exit(0);
        }else{
            	printf("parent....");
           		while(1){
                    	bzero(buf,128);
                   		read(fd[0],buf,128);
                    	printf("BUF:%s\r\n",buf);
            	}
            exit(0);
    }
    return 0;
}

该程序的作用是子进程等待控制台输入,父进程从管道中读取数据,并打印到控制台。需要注意的是pipe函数的调用必须在fork函数之前,否则子进程将无法通过内存拷贝的方式获取无名管道文件描述符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值