用命名管道实现client和server端进行通信
【实现步骤】
- 创建两个没有关系的进程--》编写client和server源文件,并分别编译成可执行程序;
- 创建命名管道文件,用函数int mkfifo(const char *filename,mode_t mode);
- client端以写的方式打开管道文件,server端以读的方式打开管道文件
- 进行相应的通信--》我们实现server要接受到client发送的信息(同步)
client.cc代码实现
#include<iostream>
#include<string>
#include<cstring>
#include<cassert>
#include<vector>
using std::cout;
using std::endl;
using std::cin;
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include"comm.hpp"
//用户端,用来写
int main()
{
//1. 以写方式打开管道文件
int wfd=open(fifoname.c_str(),O_WRONLY);
assert(wfd!=-1);
(void)wfd;
//2. 开始进程间通信,将用户的输入的信息写给服务端
char buffer[NUM]={0};
while(true)
{
//2.1 换行控制服务端的信息同步
// cout<<"请输入你的信息#";
// char* msg=fgets(buffer,sizeof(buffer)-1,stdin);
// assert(msg!=nullptr);
// (void)msg;
// msg[strlen(msg)-1]=0;
// int n=write(wfd,msg,strlen(msg));
// assert(n>0);
// (void)n;
//2.2 实现服务端和用户端输入的信息同步
system("stty raw");
int c = getchar();
system("stty -raw");
int n=write(wfd,(char*)&c,sizeof(char));
assert(n>0);
(void)n;
}
close(wfd);
return 0;
}
server.cc代码实现
#include<iostream>
#include<string>
#include<cstring>
#include<cassert>
#include<vector>
using std::cout;
using std::endl;
using std::cin;
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#include"comm.hpp"
//服务端,进行读
int main()
{
//1. 创建管道文件
int ret=mkfifo(fifoname.c_str(),mode);
assert(ret==0);
(void)ret;
cout<<"创建管道文件成功"<<endl;
//2. 打开管道文件
int rfd=open(fifoname.c_str(),O_RDONLY);
assert(rfd!=-1);
(void)rfd;
cout<<"以读方式打开管道文件成功"<<endl;
//3.开始通信,接受客户端传来的信息
char buffer[NUM]={0};
while(true)
{
int n=read(rfd,buffer,sizeof(buffer)-1);
if(n>0)
{
buffer[n]=0;
//cout<<"client#"<<buffer<<endl;
printf("%c",buffer[0]);
fflush(stdout);
}
else if(n==0)
{
cout<<"client quit,me too"<<endl;
break;
}
else
{
perror("read error:");
break;
}
}
ret=unlink(fifoname.c_str());
assert(ret==0);
(void)ret;
cout<<"删除管道文件成功"<<endl;
close(rfd);
cout<<"关闭读端管道文件成功"<<endl;
sleep(2);
return 0;
}
makefile文件