程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 【Linux的那些事】關於FIFO

【Linux的那些事】關於FIFO

編輯:關於C語言

   最近在處理多進程間進行數據通信(基本上屬於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有一個缺點就是,管道名必須是服務器端和客戶端協商好的。

           

本文出自 “Scalpel00” 博客,請務必保留此出處http://scalpel00.blog.51cto.com/1071749/278019

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved