⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fifo_client.cpp

📁 一个使用匿名管道进行通信的示例程序
💻 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 + -