【Linux】使用命名管道通信实例

例1. 用命名管道实现文件拷贝

如图:我用命名管道tp 实现了将文件abc 中内容拷贝至abc.bak中,具体实现过程我在上篇博客中详细说明了,这里我不赘述,只显示代码实现过程。
上篇博客:进程间通信——管道详解
在这里插入图片描述

完整代码
  1. fifo1.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>

#define ERR_EXIT(m)\
	do\
{\
	perror(m);\
	exit(EXIT_FAILURE);\
}while(0)

int main()
{
	mkfifo("tp",0644);   //创建管道
	int infd,outfd;
	infd=open("abc",O_RDONLY);
	if(infd==-1)	ERR_EXIT("open");
	outfd=open("tp",O_WRONLY);
	if(outfd==-1)	ERR_EXIT("open");

	char buf[1024];
	int n;
	while((n=read(infd,buf,1024))>0)
		write(outfd,buf,n);
	close(infd);
	close(outfd);
	return 0;
}

  1. fifo2.c
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>

#define ERR_EXIT(m)\
	do\
{\
	perror(m);\
	exit(EXIT_FAILURE);\
}while(0)

int main()
{
	int infd, outfd;
	outfd=open("abc.bak",O_WRONLY|O_CREAT);
	if(outfd==-1)  ERR_EXIT("open");
	infd=open("tp",O_RDONLY);
	if(infd==-1)	ERR_EXIT("open");

	char buf[1024];
	int n;
	while((n=read(infd,buf,1024))>0)
		write(outfd,buf,n);

	close(infd);
	close(outfd);
	unlink("tp");
	return 0;
}

  1. Makefile
.PHONY:all
all:fifo1 fifo2
fifo1:fifo1.c
	gcc -o $@ $^
fifo2:fifo2.c
	gcc -o $@ $^

.PHONY:clean
clean:
	rm -f fifo1 fifo2

例2. 用命名管道实现client和server的通信

实现过程主要是通过创建命名管道 myfifo,然后由客户端向管道中写内容,服务器从管道中读内容实现通信。
如图:
在这里插入图片描述

完整代码展示:
  1. server.c
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

#define ERR_EXIT(m)\
	do{\
		perror(m);\
		exit(EXIT_FAILURE);\
	}while(0)

int main()
{
	umask(0);
	if(mkfifo("myfifo",0644)<0)  //创建管道
		ERR_EXIT("mkfifo\n");
	int rfd=open("myfifo",O_RDONLY); //只读方式打开管道
	if(rfd<0)
		ERR_EXIT("open\n");

	char buf[1024];
	while(1)
	{
		buf[0]=0;
		printf("Please wait...\n");
		ssize_t s=read(rfd,buf,sizeof(buf)-1);
		if(s>0)   //读取成功
		{
			buf[s-1]=0;  //忽略客户端最后输入的回车
			printf("client say#:%s\n",buf);
		}
		else if(s==0)  //所读文件已经关闭
		{
			printf("client quit,exit now!\n");
			exit(EXIT_SUCCESS);
		}
		else  //读取文件失败
			ERR_EXIT("read error\n");
	}
	close(rfd);
	return 0;
}

  1. client.c
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

#define ERR_EXIT(m)\
	do{\
		perror(m);\
		exit(EXIT_FAILURE);\
	}while(0)

int main()
{
	umask(0);
	int wfd=open("myfifo",O_WRONLY); //只写方式打开管道
	if(wfd<0)
		ERR_EXIT("open\n");

	char buf[1024];
	while(1)
	{
		buf[0]=0;
		printf("Please Enter#:");
		fflush(stdout);
		ssize_t s=read(0,buf,sizeof(buf)-1);
		if(s>0)   //读取成功
		{
			buf[s]=0;  //给字符串最后补充 \0
			write(wfd,buf,strlen(buf));
		}
		else  //读取文件失败
			ERR_EXIT("read error\n");
	}
	close(wfd);
	return 0;
}

  1. Makefile
.PHONY:all
all:client server
client:client.c
	gcc -o $@ $^
server:server.c
	gcc -o $@ $^

.PHONY:clean
clean:
	rm -f client server

多多支持博主哦~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值