歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux管理 >> Linux網絡 >> Linux網絡編程:read和write函數的包裝

Linux網絡編程:read和write函數的包裝

日期:2017/3/1 10:30:37   编辑:Linux網絡
  1. #include <unistd.h>
  2. #include <errno.h>
  3. ssize_t readn(int fd, void *buf, size_t count)
  4. {
  5. char *strtmp;
  6. ssize_t reval, realcount = 0;
  7. strtmp = (char *)buf;
  8. while (count > 0)
  9. {
  10. reval = read(fd, strtmp, count);
  11. if (reval < 0)
  12. if (errno == EINTR)
  13. continue;
  14. else
  15. return -1;
  16. else if (reval > 0)
  17. {
  18. count -= reval;
  19. strtmp += reval;
  20. realcount += reval;
  21. continue;
  22. }
  23. else
  24. break;
  25. }
  26. return realcount;
  27. }
  28. ssize_t writen(int fd, const void *buf, size_t count)
  29. {
  30. char *strtmp;
  31. ssize_t reval, realcount = count;
  32. strtmp = (char *)buf;
  33. while (count > 0)
  34. {
  35. reval = write(fd, strtmp, count);
  36. if (reval < 0)
  37. if (errno == EINTR)
  38. continue;
  39. else
  40. return -1;
  41. count -= reval;
  42. strtmp += reval;
  43. }
  44. return realcount;
  45. }
  46. ssize_t readline(int fd, void *buf, int size)
  47. {
  48. char *strtmp;
  49. ssize_t reval, realcount = 0;
  50. strtmp = (char *)buf;
  51. while (size > 1)
  52. {
  53. reval = read(fd, strtmp, 1);
  54. if (reval < 0)
  55. if (errno == EINTR)
  56. continue;
  57. else
  58. return -1;
  59. else if (reval == 0)
  60. break;
  61. else
  62. {
  63. realcount++;
  64. size--;
  65. if (*strtmp++ == '\n')
  66. break;
  67. }
  68. }
  69. *strtmp = '\0';
  70. return realcount;
  71. }

需要注意:readline函數是每次調用一次系統函數讀取一個字節,這樣導致效率很低。

Copyright © Linux教程網 All Rights Reserved