快速业务通道

【Linux的那些事】关于FIFO

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-24

最近在处理多进程间进行数据通信(基本上属于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. int main(int argc,char** argv){
  11. int fd;
  12. int len;
  13. char buf[PIPE_BUF];
  14. time_t tp;
  15. if(argc!=2){
  16. printf("Usage:client [Name]");
  17. }
  18. if((fd = open(argv[1],O_WRONLY))<0){
  19. perror("open");
  20. exit(EXIT_FAILURE);
  21. }
  22. while(1){
  23. time(&tp);
  24. len = sprintf(buf,"wrfifo: %d sends %s",getpid(),ctime(&tp));
  25. if((write(fd,buf,len 1))<0){
  26. perror("write");
  27. close(fd);
  28. exit(EXIT_FAILURE);
  29. }
  30. }
  31. close(fd);
  32. exit(EXIT_SUCCESS);
  33. }

服务器端:

  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 fifo1n");
  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 fifo2n");
  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("loopn");
  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("exitn");
  50. exit(EXIT_SUCCESS);
  51. }

将上述程序编译

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

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

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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号