Здравствуйте.
есть вот такой код
ssize_t ret;
while (len != 0 && (ret = read (fd, buf, len)) != 0) {
if (ret == –1) {
if (errno == EINTR)
continue;
perror ("read");
break;
}
len -= ret;
buf += ret;
}
и следующее описание
В этом фрагменте кода обрабатываются все пять условий. Цикл считывает
len
байт с актуальной файловой позиции, равной значениюfd
, и записывает их вbuf
. Разумеется, значениеbuf
должно быть как минимум равно значениюlen
. Чтение продолжается, пока не будут получены всеlen
байт или до достижения конца файла. Если прочитано ненулевое количество байтов, которое, однако, меньшеlen
, то значениеlen
уменьшается на количество прочитанных байтов,buf
увеличивается на то же количество и вызов повторяется. Если вызов возвращает –1 и значениеerrno
, равноеEINTR
, то вызов повторяется без обновления параметров. Если вызов возвращает –1 с любым другим значениемerrno
, вызываетсяperror()
. Он выводит описание возникшей проблемы в стандартную ошибку, и выполнение цикла прекращается. пробую этот код запустить(упрощенный вариант):
int main()
{
ssize_t ret;
int buf[16];
int len = 16;
int fd;
fd = open("./data", O_RDONLY);
while (len != 0 && (ret = read (fd, buf, len)) != 0)
{
if (ret == -1)
{
if (errno == EINTR) continue;
perror ("read");
break;
}
printf("%s", buf);
len -= ret;
buf += ret;
}
}
как я полагаю: buf
- 16 байт, len
- 16 байт, те мы считываем из fd
16 байт (len), в буфер buf
, который тоже 16 байт. непонятно как буфер
buf
увеличивается на то же количество
считываем мы по 16 байт, потом считали 10, допустим, и зачем нам увеличивать буфер (и как его увеличивать?) и уменьшать длину (len). Если read
прервали, то мы просто считываем заново - continue
… не «догоняю» момент с изменеием len
и buf
…