最近在处理多进程间进行数据通信(基本上属于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>
-
- 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 fifo1n");
- if((fd1=open("fifo1",O_RDONLY|O_NONBLOCK))<0){
-
- perror("open1");
- exit(EXIT_FAILURE);
- }
- printf("open fifo2n");
- if((fd2=open("fifo2",O_RDONLY|O_NONBLOCK))<0){
-
- perror("open2");
- exit(EXIT_FAILURE);
- }
- printf("loopn");
- 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("exitn");
- exit(EXIT_SUCCESS);
- }
将上述程序编译
分别在三个超级终端中运行 ./server ./client fifo1 ./client fifo2
如果把server.c里面的open的参数中的O_NONBLOCK参数去掉,server的程序就会阻塞在第一个open操作中!
FIFO有一个缺点就是,管道名是服务器端和客户端协商好的.
|