📄 fifo_client.cpp
字号:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>
#include <errno.h>
using namespace std;
#define FIFO_NAME1 "fifo_test1" //client 利用此管道读,server 用此管道写
#define FIFO_NAME2 "fifo_test2" //client 利用次官道写,server 用此管道读
//倒转函数
void reserbuf(char string[512])
{
char temp[512];
for(int i = 0;i<strlen(string)+1;i++)
{ // printf("%d",sizeof(string));
temp[strlen(string)-i]=string[i];
}
temp[strlen(string)+1]='\0';
strcpy(string,temp);
}
int main(int argc,char **argv)
{
char rd_buf[512]; //读到的数据存入此缓冲区
char wr_buf[512];
int rd_fd; //client的读管道描述符
int wr_pid;
if(argc==2&&strcmp(argv[1],"-b")==0)
rd_fd=open(FIFO_NAME1,O_RDONLY,0);
else
rd_fd=open(FIFO_NAME1,O_RDONLY|O_NONBLOCK,0);
if(rd_fd!=-1)
cout<<"open success"<<endl;
else{
perror("open fail");
return 0;
}
for(;;)
{
int read_num=0;
memset(rd_buf,0,sizeof(rd_buf));
read_num=read(rd_fd,rd_buf,512); //读数据,若读到的数据字节数大于0,则进行倒转,然后 //从写入另一个管道
if(read_num>0)
{
cout<<"real read bytes:"<<read_num<<endl;
cout<<"read data:"<<rd_buf<<endl;
strcpy(wr_buf,rd_buf);
reserbuf(wr_buf);
printf("write data is:%s",wr_buf);
if((wr_pid=fork())==0)//创建一个子进程处理发送数据的工作
{
int wr_fd=open(FIFO_NAME2,O_WRONLY|O_NONBLOCK,0);//以只写方式打开管道2
if(wr_fd<0){
perror("child process open fail");
exit(1);
}
int wr_num=write(wr_fd,wr_buf,sizeof(wr_buf));//向管道2写倒转后的数据
if(wr_num>0)
printf("the real write data num is:%d\n",wr_num);
sleep(1);
}
}
}
//删除管道文件
//unlink(FIFO_NAME);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -