Linux进程间通讯 | 管道


一、管道

有名管道
无名管道
区别:有名管道在任意两个进程间通信,无名管道一般在父子进程间通信。

二、使用步骤

1.有名管道

在这里插入图片描述

代码如下(示例):

//////////
mkfifo//首先创建管道文件 fifo
//创建a.c,向文件中写入”hello“
int main()
{
	int fd=open("./fifo",O_WRONLY)//打开管道文件,只写方式
	assert(fd!=-1);
	printf("fd=%d\n",fd);
	write(fd,"hello",5);//写入数据
	close(fd)//关闭文件
}
//创建b.c,从文件读取数据
int main()
{
	int fd=open("./fifo",O_RDONLY)//打开管道文件,只读方式
	assert(fd!=-1);
	printf("fd=%d\n",fd);
	char buff[128]={0};
	read(fd,buff,127);//读取数据
	printf("read:%s\n",buff);//打印
	close(fd)//关闭文件
}

执行结果:
在这里插入图片描述
在这里插入图片描述

2.无名管道

在这里插入图片描述

代码如下(示例):

int main()
{
	int fd[2];// fd[0]读端   fd[1]写端
	assert(pipe(fd)!=-1);//创建无名管道
	pid_t pid=fork();
	assert(pid!=-1);
	if(pid==0)//子进程写入数据
	{
		close(fd[0])
		write(fd[1],"hello",5);
		close(fd[1]);	
	}
	else//父进程读取数据
	{	
		close(fd[1])
		char buff[128]={0};
		read(fd[0],buff,127);
		printf("read:%s\n",buff);
		close(fd[0]);
	}
}

总结

管道不是真实存在的,是内存的一种直观表现形式,向管道中写入数据其实是向内存中写入数据,因此进程间通常采用管道而不采用磁盘文件。
管道通讯是半双工的,通讯时数据流只能是单向的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值