【Linux的那些事】关于FIFO

   最近在处理多进程间进行数据通信(基本上属于1服务器多客户端类型的),而且通信的数据属于视频数据,量比较大,权衡再三,决定使用FIFO来处理。

   服务器与每个客户端之间用一个专属的FIFO有名管道,这就存在一个阻塞的问题,不过可以通过添加O_NONBLOCK来设置为非阻塞状态。

  下面是我写的一个测试程序,包含客户端和服务器端,服务器与每个客户端之间单独的fifo有名管道

  客户端:  

  
  
  
  
  1. #include <sys/types.h> 
  2. #include <sys/stat.h> 
  3. #include <unistd.h> 
  4. #include <errno.h> 
  5. #include <stdio.h> 
  6. #include <stdlib.h> 
  7. #include <fcntl.h> 
  8. #include <limits.h> 
  9. #include <time.h> 
  10.  
  11. int main(int argc,char** argv){ 
  12.     int fd; 
  13.     int len; 
  14.     char buf[PIPE_BUF]; 
  15.     time_t tp; 
  16.     if(argc!=2){ 
  17.         printf("Usage:client [Name]"); 
  18.     } 
  19.     if((fd = open(argv[1],O_WRONLY))<0){ 
  20.         perror("open"); 
  21.         exit(EXIT_FAILURE); 
  22.     } 
  23.     while(1){ 
  24.         time(&tp); 
  25.         len = sprintf(buf,"wrfifo: %d sends %s",getpid(),ctime(&tp)); 
  26.         if((write(fd,buf,len+1))<0){ 
  27.             perror("write"); 
  28.             close(fd); 
  29.             exit(EXIT_FAILURE); 
  30.         } 
  31.     } 
  32.     close(fd); 
  33.     exit(EXIT_SUCCESS); 

    服务器端:   

  
  
  
  
  1. #include <sys/types.h> 
  2. #include <sys/stat.h> 
  3. #include <unistd.h> 
  4. #include <errno.h> 
  5. #include <stdio.h> 
  6. #include <stdlib.h> 
  7. #include <fcntl.h> 
  8. #include <limits.h> 
  9. //#define PIPE_BUF 8192 
  10. int main(void){ 
  11.     int fd1,fd2; 
  12.     int dumy1,dumy2; 
  13.     int len1,len2; 
  14.     char buf1[PIPE_BUF],buf2[PIPE_BUF]; 
  15.     mode_t mode = 0666; 
  16.     unlink("fifo1"); 
  17.     unlink("fifo2"); 
  18.     if((mkfifo("fifo1",mode))<0){ 
  19.         perror("mkfifo1"); 
  20.         exit(EXIT_FAILURE); 
  21.     } 
  22.     if((mkfifo("fifo2",mode))<0){ 
  23.         perror("mkfifo2"); 
  24.         exit(EXIT_FAILURE); 
  25.     } 
  26.     printf("open fifo1\n"); 
  27.     if((fd1=open("fifo1",O_RDONLY|O_NONBLOCK))<0){ 
  28. //  if((fd1=open("fifo1",O_RDONLY,0))<0){ 
  29.         perror("open1"); 
  30.         exit(EXIT_FAILURE); 
  31.     } 
  32.     printf("open fifo2\n"); 
  33.     if((fd2=open("fifo2",O_RDONLY|O_NONBLOCK))<0){ 
  34. //  if((fd2=open("fifo2",O_RDONLY,0))<0){ 
  35.         perror("open2"); 
  36.         exit(EXIT_FAILURE); 
  37.     } 
  38.     printf("loop\n"); 
  39.     while(1){ 
  40.         len1 = read(fd1,buf1,PIPE_BUF-1); 
  41.         if(len1>0) 
  42.             printf("rdfifo1 read: %s",buf1); 
  43.         len2 = read(fd2,buf2,PIPE_BUF-1); 
  44.         if(len2>0) 
  45.             printf("rdfifo2 read: %s",buf2);     
  46.     } 
  47.     close(fd1); 
  48.     close(fd2); 
  49.     printf("exit\n"); 
  50.     exit(EXIT_SUCCESS); 

      将上述程序编译

     分别在三个超级终端中运行 ./server    ./client fifo1     ./client fifo2

    如果把server.c里面的open的参数中的O_NONBLOCK参数去掉,server的程序就会阻塞在第一个open操作中!

   FIFO有一个缺点就是,管道名必须是服务器端和客户端协商好的。

           

你可能感兴趣的:(linux,职场,休闲,fifo,linux系统)