APUE学习之----进程通信pipe实现管道

本文深入探讨了使用管道实现父子进程间的数据传递,解释了管道的特性,如半双工、两端读写及自适应阻塞机制,并通过代码实例展示了如何在父进程和子进程之间建立管道,完成数据的发送与接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,pipe()介绍

管道的特点:

1.管道是半双工的,即同一时间数据只能从一端流向另一端。试想,如果一个管道从两边同时输入和输出数据,那么管道里的数据就乱了。

2.管道的两端一端作为读端,一端作为写端。

3.管道具有自适应的特点,默认会适应速度比较慢的一方,管道被写满或读空时速度快的一方会自动阻塞。

#include <unistd.h> 
int pipe(int pipefd[2]);

pipe(2) 用于创建管道,pipefd 是一个数组,表示管道的两端文件描述符,pipefd[0] 端作为读端,pipefd[1] 端作为写端

pipe(2) 产生的是匿名管道,在磁盘的任何位置上找不到这个管道文件,而且匿名管道只能用于具有亲缘关系的进程之间通信

一般情况有亲缘关系的进程之间使用管道进行通信时,会把自己不用的一端文件描述符关闭。

下面用两个pipe()管道实现父进程和子进程之间的互相传送数据。


二,代码实现

其中pa_write用于父进程向子进程发送数据,pa_read用于父进程读取子进程发送的数据。

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

int main(int argc,char *argv[])
{
	int pa_write[2],pa_read[2];
	pid_t pid;
	int len;
	char buf[BUFSIZ];
	if(pipe(pa_write)<0){
		perror("pipe()");
		exit(1);
	}
	if(pipe(pa_read)<0){
		perror("pipe()");
		exit(1);
	}
	pid=fork();
	if(pid<0){
		perror("fork()");
		exit(1);
	}
	else if(pid==0){
		close(pa_write[1]);
		close(pa_read[0]);
		printf("BUFSIZ:%d\n",BUFSIZ);
		len=read(pa_write[0],buf,BUFSIZ);
		printf("child output:%s\n",buf);
		write(pa_read[1],"hello,how are you",17);
		close(pa_read[1]);
		close(pa_write[0]);
		exit(0);
	}
	else{
		close(pa_write[0]);
		write(pa_write[1],"hello zt",8);
		sleep(1);
		len=read(pa_read[0],buf,BUFSIZ);
		printf("parent output:%s\n",buf);
		close(pa_read[0]);
		close(pa_write[1]);
		wait(NULL);
		exit(0);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值