Здравствуйте.
есть вот такой код
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 …
