Linux基础学习—匿名管道

33 篇文章 0 订阅
11 篇文章 0 订阅

进程可以通过调用函数pipe()创建一个管道。函数pipe()的原型如下:

int pipe(int fildes[2]);

从本质上来说,pipe()函数的功能就是创建一个内存文件,但与创建普通文件的函数不同,函数pipe()将在参数fildes中为进程返回这个文件的两个文件描述符fildes[0]和fildes[1]。
其中,fildes[0]是一个具有“只读”属性的文件描述符,fildes[1]是一个具有“只写”属性的文件描述符,
即进程通过fildes[0]只能进行文件的读操作,而通过fildes[1]只能进行文件的写操作

管道使用read()和write()函数,采用字节流的方式,具有流动性,读数据时,每读一段数据,则管道内会清除已读走的数据。
读管道时,若管道为空,则被堵塞,直至管道另一端write将数据写入到管道为止。若写段已关闭,则返回0;
写管道时,若管道已满,则被阻塞,直到管道另一端read将管道内数据取走为止。

匿名管道的局限性主要有两点:一是由于管道建立在内存中,所以它的容量不可能很大;
二是管道所传送的是无格式字节流,这就要求使用管道的双方实现必须对传输的数据格式进行约定。

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>


int main()
{
	pid_t pid;
	char *str = {"hello world!\n"};
	int fd[2], i, n;
	char buf[1024];
 
	int ret = pipe(fd);
	if(ret == -1){
		perror("pipe error\n");
		exit(1);
	}
	pid = fork();
 
	if(pid > 0){
		wait(NULL);			
		close(fd[1]);       //父进程关闭写端,留读端读取数据    
		n = read(fd[0],buf,strlen(str));     //从管道中读数据
		write(STDOUT_FILENO,buf,n);
		printf("the text from son:%s\n",buf);


	}else if(pid == 0){
		close(fd[0]);
		write(fd[1],str, strlen(str));
		exit(0);
	}
	else{
		perror("pipe error\n");
		exit(1);
	}

	return 0;

}

学识浅薄,希望可以帮到您

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值