最近在處理多進程間進行數據通信(基本上屬於1服務器多客戶端類型的),而且通信的數據屬於視頻數據,量比較大,權衡再三,決定使用FIFO來處理。
服務器與每個客戶端之間用一個專屬的FIFO有名管道,這就存在一個阻塞的問題,不過可以通過添加O_NONBLOCK來設置為非阻塞狀態。
下面是我寫的一個測試程序,包含客戶端和服務器端,服務器與每個客戶端之間單獨的fifo有名管道
客戶端:
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h>
- #include <errno.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <limits.h>
- #include <time.h>
- int main(int argc,char** argv){
- int fd;
- int len;
- char buf[PIPE_BUF];
- time_t tp;
- if(argc!=2){
- printf("Usage:client [Name]");
- }
- if((fd = open(argv[1],O_WRONLY))<0){
- perror("open");
- exit(EXIT_FAILURE);
- }
- while(1){
- time(&tp);
- len = sprintf(buf,"wrfifo: %d sends %s",getpid(),ctime(&tp));
- if((write(fd,buf,len+1))<0){
- perror("write");
- close(fd);
- exit(EXIT_FAILURE);
- }
- }
- close(fd);
- exit(EXIT_SUCCESS);
- }
服務器端:
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h>
- #include <errno.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <limits.h>
- //#define PIPE_BUF 8192
- int main(void){
- int fd1,fd2;
- int dumy1,dumy2;
- int len1,len2;
- char buf1[PIPE_BUF],buf2[PIPE_BUF];
- mode_t mode = 0666;
- unlink("fifo1");
- unlink("fifo2");
- if((mkfifo("fifo1",mode))<0){
- perror("mkfifo1");
- exit(EXIT_FAILURE);
- }
- if((mkfifo("fifo2",mode))<0){
- perror("mkfifo2");
- exit(EXIT_FAILURE);
- }
- printf("open fifo1\n");
- if((fd1=open("fifo1",O_RDONLY|O_NONBLOCK))<0){
- // if((fd1=open("fifo1",O_RDONLY,0))<0){
- perror("open1");
- exit(EXIT_FAILURE);
- }
- printf("open fifo2\n");
- if((fd2=open("fifo2",O_RDONLY|O_NONBLOCK))<0){
- // if((fd2=open("fifo2",O_RDONLY,0))<0){
- perror("open2");
- exit(EXIT_FAILURE);
- }
- printf("loop\n");
- while(1){
- len1 = read(fd1,buf1,PIPE_BUF-1);
- if(len1>0)
- printf("rdfifo1 read: %s",buf1);
- len2 = read(fd2,buf2,PIPE_BUF-1);
- if(len2>0)
- printf("rdfifo2 read: %s",buf2);
- }
- close(fd1);
- close(fd2);
- printf("exit\n");
- exit(EXIT_SUCCESS);
- }
將上述程序編譯
分別在三個超級終端中運行 ./server ./client fifo1 ./client fifo2
如果把server.c裡面的open的參數中的O_NONBLOCK參數去掉,server的程序就會阻塞在第一個open操作中!
FIFO有一個缺點就是,管道名必須是服務器端和客戶端協商好的。
本文出自 “Scalpel00” 博客,請務必保留此出處http://scalpel00.blog.51cto.com/1071749/278019