Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

Все функции возвращают: количество считанных или записанных байтов, -1 в случае ошибки

В листинге 3.9 представлена функция

readn
, в листинге 3.10 — функция
writen
, а в листинге 3.11 — функция
readline
.

Листинг 3.9. Функция readn: считывание n байт из дескриптора

//lib/readn.c

1 #include "unp.h"

2 ssize_t /* Считывает n байт из дескриптора */

3 readn(int fd, void *vptr, size_t n)

4 {

5 size_t nleft;

6 ssize_t nread;

7 char *ptr;

8 ptr = vptr;

9 nleft = n;

10 while (nleft > 0) {

11 if ((nread = read(fd, ptr, nleft)) < 0) {

12 if (errno == EINTR)

13 nread = 0; /* и вызывает снова функцию read */

14 else

15 return (-1);

16 } else if (nread == 0)

17 break; /* EOF */

18 nleft -= nread;

19 ptr += nread;

20 }

21 return (n - nleft); /* возвращает значение >= 0 */

22 }

Листинг 3.10. Функция writen: запись n байт в дескриптор

//lib/writen.c

1 #include "unp.h"

2 ssize_t /* Записывает n байт в дескриптор */

3 writen(int fd, const void *vptr, size_t n)

4 {

5 size_t nleft;

6 ssize_t nwritten;

7 const char *ptr;

8 ptr = vptr;

9 nleft = n;

10 while (nleft > 0) {

11 if ((nwritten = write(fd, ptr, nleft)) <= 0) {

12 if (errno == EINTR)

13 nwritten = 0; /* и снова вызывает функцию write */

14 else

15 return (-1); /* ошибка */

16 }

17 nleft -= nwritten;

18 ptr += nwritten;

19 }

20 return (n);

21 }

Листинг 3.11. Функция readline: считывание следующей строки из дескриптора, по одному байту за один раз

//test/readline1.с

1 #include "unp.h"

/* Ужасно медленная версия, приводится только для примера */

2 ssize_t

3 readline(int fd, void *vptr, size_t maxlen)

4 {

5 ssize_t n, rc;

6 char c, *ptr;

7 ptr = vptr;

8 for (n = 1; n < maxlen; n++) {

9 again:

10 if ((rc = read(fd, &c, 1)) == 1) {

11 *ptr++ = c;

12 if (c == '\n')

13 break; /* записан символ новой строки, как в fgets */

14 } else if (rc == 0) {

15 if (n == 1)

16 return (0); /* EOF, данные не считаны */

17 else

18 break; /* EOF, некоторые данные были считаны */

  • Читать дальше
  • 1
  • ...
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: