npipe.c
上传用户:mei_mei897
上传日期:2007-01-05
资源大小:82k
文件大小:4k
源码类别:

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* npipe.c */
  5. /* */
  6. /*  Copyright (C) 1997,1998 Angelo Masci */
  7. /* */
  8. /*  This library is free software; you can redistribute it and/or */
  9. /*  modify it under the terms of the GNU Library General Public */
  10. /*  License as published by the Free Software Foundation; either */
  11. /*  version 2 of the License, or (at your option) any later version. */
  12. /* */
  13. /*  This library is distributed in the hope that it will be useful, */
  14. /*  but WITHOUT ANY WARRANTY; without even the implied warranty of */
  15. /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU */
  16. /*  Library General Public License for more details. */
  17. /* */
  18. /*  You should have received a copy of the GNU Library General Public */
  19. /*  License along with this library; if not, write to the Free */
  20. /*  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
  21. /* */
  22. /*  You can contact the author at this e-mail address: */
  23. /* */
  24. /*  angelo@styx.demon.co.uk */
  25. /* */
  26. /* -------------------------------------------------------------------- */
  27. /* $Id$
  28.    -------------------------------------------------------------------- */
  29. #include <stdio.h>
  30. #include <stdlib.h>
  31. #include <errno.h>
  32. #include <string.h>
  33. #include <sys/time.h>
  34. #include <sys/types.h>
  35. #include <sys/stat.h>
  36. #include <unistd.h>
  37. #include <fcntl.h>
  38. #include "npipe.h"
  39. #include "common.h"
  40. /* -------------------------------------------------------------------- */
  41. /* -------------------------------------------------------------------- */
  42. int create_named_pipe(char *file)
  43. {
  44. return mkfifo(file, O_RDWR|O_CREAT|O_NONBLOCK);
  45. }
  46. /* -------------------------------------------------------------------- */
  47. /* -------------------------------------------------------------------- */
  48. int delete_named_pipe(char *file)
  49. {
  50. return unlink(file);
  51. }
  52. /* -------------------------------------------------------------------- */
  53. /* Read one character from named pipe. */
  54. /* If no character is available block. */
  55. /* -------------------------------------------------------------------- */
  56. int block_on_named_pipe(char *file)
  57. {
  58. fd_set  readfds,
  59. writefds,
  60. exceptfds;
  61. int nfds,
  62. rtval,
  63. fd,
  64. waiting, 
  65. c,
  66. res;
  67. /* ---------------------------- */
  68. fd = open(file, O_RDWR|O_NONBLOCK);
  69. if (fd == -1)
  70. { return -1;
  71. }
  72. nfds = fd +1;
  73. FD_ZERO(&writefds);
  74. FD_ZERO(&readfds);
  75. FD_ZERO(&exceptfds);
  76. waiting = TRUE;
  77. while(waiting)
  78. {
  79. FD_SET(fd,&readfds);
  80. if ((rtval = select(nfds, &readfds, NULL, NULL, NULL)) != 0)
  81. {
  82. if (rtval > 0) /* Select Woken on FDs */
  83. {
  84. if (FD_ISSET(fd, &readfds))
  85. {
  86. res = read(fd, &c, 1);
  87. while(res != 1)
  88. {
  89. if (res == -1)
  90. {
  91. if (errno != EINTR)
  92. { return -1;
  93. }
  94. }
  95. else
  96. if (res == 0)
  97. { return -1;
  98. }
  99. res = read(fd, &c, 1);
  100. }
  101. waiting = FALSE;
  102. }
  103. }
  104. else 
  105. if (rtval == -1)  /* Error Return Value */
  106. {
  107. if (errno != EINTR)
  108. { return -1;
  109. }
  110. }
  111. }
  112. }
  113. close(fd);
  114. return 0;
  115. }
  116. /* -------------------------------------------------------------------- */
  117. /* Write one character to named pipe. */
  118. /* -------------------------------------------------------------------- */
  119. int write_to_named_pipe(char *file)
  120. {
  121. int fd,
  122. res,
  123. c;
  124. fd = open(file, O_RDWR|O_NONBLOCK);
  125. if (fd == -1)
  126. { return -1;
  127. }
  128. c = 'X';
  129. res = write(fd, &c, 1);
  130. while(res != 1)
  131. {
  132. if (res == -1)
  133. {
  134. if (errno != EINTR)
  135. { return -1;
  136. }
  137. }
  138. res = write(fd, &c, 1);
  139. }
  140. close(fd);
  141. return 0;
  142. }