进程间通信方式(2)有名管道

书接上文为大家介绍了无名管道的介绍,本文为大家继续介绍管道的第二种---有名管道,有名管道和无名管道的最大区别就是可以进行没有亲缘关系的父子进程间通信,那么本文将详细的为大家介绍有名管道的方式!

框架:创建有名管道 ==》打开有名管道 ==》读写管道==》关闭管道  ==》卸载有名管道

和无名管道类似,有名管道的框架大体相同,但不同于无名管道的区别是,有名管道的mkfifo的操作是创建一个管道,并非像无名管道一样pipe出来的返回值已经就是管道,mkfifo是创建一个管道,后续我们要进行open创建出来的管道的一端为输入或者输出的端口进行读写操作实现没有亲缘关系的不同进程间的数据通信和信息交换。

1.创建有名管道mkfifo

int mkfifo(const char *pathname, mode_t mode);

  • 功能:在指定的pathname路径+名称下创建一个权限为mode的有名管道文件
  • 参数:
    • pathname要创建的有名管道路径 
    • mode--->8进制文件权限(通常为0777、0666、0664)
  • 返回值:
    • 成功 0
    • 失败-1       

2.打开有名管道open

  • 以O_RDONLR打开时 ,管道在open处阻塞
  • 以O_WRONLY打开时 ,管道在open处阻塞
  • 当两端同时打开时,才解除阻塞。

3.读写管道read、write

通过文件IO的方式读写open打开的读写端,这里把读写端仍然看做文件描述符对其进行操作

4.关闭端口close

关闭open打开的文件描述符指向的读写的两端口

5.卸载有名管道remove

int remove(const char *pathname);

  • 功能:将指定的pathname管道文件卸载,同时从文件系统中删除。
  • 参数: ptahtname 要卸载的有名管道 
  • 返回值:
    • 成功 0
    • 失败  -1

代码示例:

//read的读取端,从另一个进程中收取发过来的信息
int main(int argc, const char *argv[])
{
	int ret = mkfifo("./fifo", 0777);	
	if(ret < 0 && errno != EEXIST)
	{
		perror("fail to mkfifo");
		return -1;
	}

	int fd_r = open("fifo", O_RDONLY);
	if(-1 == fd_r)
	{
		perror("fail to open");
		return -1;
	}

	while(1)
	{
		char buff[1024] = {0};
		read(fd_r, buff, sizeof(buff));
		if(0 == strcmp(buff, "quit\n"))
		{
			break;
		}
		printf("w->r:%s", buff);
	}
	close(fd_r);
	remove("fifo");
	return 0;
}

//从终端获取一段信息,并且输入到fifo管道里面给另一端口写入
int main(int argc, const char *argv[])
{
	int fifo = mkfifo("./fifo", 0777);	
	if(-1 == fifo && errno != EEXIST)
	{
		perror("fail to mkfifo");
		return -1;
	}

	int fd_w = open("fifo", O_WRONLY);
	if(-1 == fd_w)
	{
		perror("fail to open");
		return -1;
	}

	while(1)
	{
		char buff[1024] = {0};
		fgets(buff, sizeof(buff), stdin);
		write(fd_w, buff, strlen(buff)+1);
		if(0 == strcmp(buff, "quit\n"))
		{
			break;
		}
	}
	close(fd_w);
	remove("fifo");
	return 0;
}

以上的代码实现的内容为两个没有父子亲缘关系的进程可以通过mkfifo建立管道,从而实现两个没有关系的进程之间的收发数据的通信方式。

通过以上代码可以让我们看出,mkfifo的简单使用,从而进一步加强我们知识理解,感兴趣的同学可以思考进行全双工的两个进程的通信方式,可以利用再之前学过的并发的知识来实现,具体的代码可以私聊我获得。

以上就是进程间通信的管道方式的两种方式,接下来为大家进行共享内存的通信方式的讲解,谢谢大家!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畅畅ccc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值