fifo.c
上传用户:sxdewei
上传日期:2014-06-02
资源大小:67k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <errno.h>
  4. #include <fcntl.h>
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8. #include "fifo.h"
  9. #include "sysconf.h"
  10. int open_read_fifo()
  11. {
  12. char fifo_name[MAX_FILE_NAME_LEN];
  13. int r_fd;
  14. memset(fifo_name, 0, MAX_FILE_NAME_LEN);
  15. sprintf(fifo_name, "/tmp/fifo%d", getpid());
  16. //printf("fifo file : %sn",fifo_name);
  17. if((mkfifo(fifo_name, O_CREAT|O_EXCL)<0) && (errno!=EEXIST))
  18. DEBUGMSG(1, ("cannot create %sn", fifo_name));
  19. r_fd = open(fifo_name, O_RDONLY|O_NONBLOCK,0);
  20. if(r_fd == -1)
  21. {
  22. DEBUGMSG(1, ("open read errorn"));
  23. return -1;
  24. }
  25. return r_fd;
  26. }
  27. void close_read_fifo()
  28. {
  29. char fifo_name[MAX_FILE_NAME_LEN];
  30. memset(fifo_name, 0, MAX_FILE_NAME_LEN);
  31. sprintf(fifo_name, "/tmp/fifo%d", getpid());
  32. if(0 != unlink(fifo_name) )
  33. {
  34.          printf("unable to delete fifo file ,error: %s n",strerror(errno));
  35. }
  36.     else{
  37.          // printf("successed to delete fifo file %sn",fifo_name);
  38.          }
  39. }
  40. int read_fifo(int r_fd)
  41. {
  42. int i = 0;
  43. fd_set file_set;
  44. struct timeval delay_time;
  45. char r_buf[MAX_CMD_LEN];
  46. int maxfd;
  47. int result;
  48. int ret_size;
  49. while(1)
  50. // while(i<READ_FIFO_DELAY_TIME)                                    //change READ_FIFO_DELAY_TIME if necessary
  51. {
  52. FD_ZERO(&file_set);
  53. delay_time.tv_sec = 0;
  54. delay_time.tv_usec = 50000;
  55. FD_SET(r_fd, &file_set);
  56. maxfd = r_fd + 1;
  57. select(maxfd, &file_set, NULL, NULL, &delay_time);
  58. if(FD_ISSET(r_fd, &file_set))
  59. {
  60. ret_size = read(r_fd, r_buf, FIFO_PAGE_SIZE);
  61. if(ret_size > 0)
  62. {
  63. result = atoi(r_buf);
  64. return result;
  65. }
  66. }
  67. i++;
  68. }
  69. return 0;
  70. }
  71. int  open_write_fifo()
  72. {
  73. int w_fd;
  74. w_fd = open(CGI_TO_MAIN_FIFO, O_WRONLY|O_NONBLOCK, 0);
  75. if(w_fd == -1)
  76. if(errno == ENXIO)
  77. DEBUGMSG(1, ("open error; no reading processn"));
  78. return w_fd;
  79. }
  80. void close_write_fifo(int w_fd)
  81. {
  82. close(w_fd);
  83. }
  84. int notify_config(int w_fd)
  85. {
  86. char cmd_str[MAX_CMD_LEN];
  87. int ret_size;
  88. memset(cmd_str, 0, MAX_CMD_LEN);
  89. sprintf(cmd_str, "%dn", getpid());
  90. ret_size = write(w_fd, cmd_str, strlen(cmd_str));
  91. return ret_size;
  92. }
  93. int send_cmd(int w_fd, int cmd)
  94. {
  95. char cmd_str[MAX_CMD_LEN];
  96. int ret_size;
  97. memset(cmd_str, 0, MAX_CMD_LEN);
  98. sprintf(cmd_str, "0 %d %dn", cmd, getpid());
  99. ret_size = write(w_fd, cmd_str, strlen(cmd_str));
  100. return ret_size;
  101. }