2016-01-19 3 views
1

Документация довольно неопределенная. Если я несколько раз назову C функции read(), я должен передать количество байтов, которые я хочу читать каждый раз. Но как я узнаю, что будет начальным индексом? Например:Что произойдет, если я буду называть C read() несколько раз?

n = read(fd, *buffer, 10) n2 = read(fd, *buffer, 10)

Первый вызов read будет читать 10 байт файла с дескриптором файла fd в buffer. Но когда я снова назову его, прочитает ли он то же самое или прочитает ли он следующий 10 байт? Я действительно не думаю, что это имело бы смысл, но я не вижу способа определить желаемый исходный индекс в противном случае.

+1

@ John3136 Это не то, как вы делаете портативное программное обеспечение. – fuz

+1

Документация довольно понятна: * смещение файла увеличивается на количество прочитанных байтов *. – AntonH

+0

@FUZxxl Вы пытаетесь сказать мне, что 'read()' не переносится в том, возвращает ли он одни и те же байты снова и снова? – John3136

ответ

5

Операционная система отслеживает «текущую позицию» в файле. Когда вы откроете файл, это будет начало файла. Каждый раз, когда вы вызываете read, вы читаете несколько байтов из текущей позиции, а также продвигаете текущую позицию. Вы можете использовать lseek, чтобы изменить текущую позицию.

Обратите внимание, что read также работает с вещами, которые не имеет имеют текущее положение, например, трубы и розетки. Поскольку чтение из них всегда будет возвращать следующий бит данных, которые вы еще не прочитали, это делает их совместимыми с тем, как работают файлы (за исключением того, что вы не можете использовать lseek).

2

Функция read(fd, buf, len) будет продвигать смещение, сохраненное в описании файла, на которое ссылается fd на len. Каждый раз, когда вы вызываете read или write, действие происходит при этом смещении, и после этого смещение увеличивается. Возможно, вы сможете вручную переместить смещение с lseek() в зависимости от того, к какому файлу относится fd.

Существует также пара функций pread() и pwrite(), которые не изменяют это смещение, вместо этого вы должны явно передать смещение функции. Обратите внимание, что pwrite() нарушен относительно O_APPEND на Linux.

Для получения более подробной информации ознакомьтесь с публикацией IEEE 1003.1, 2013 (POSIX.1 2008) о read().

+0

Я думал, что это 'pwrite()', который сломан в Linux? См. Http://man7.org/linux/man-pages/man2/pread.2.html#BUGS –

+0

Да, конечно, 'pwrite' был сломанным. – fuz