Должен ли я обновить файл-дескриптор здесь? - PullRequest
1 голос
/ 02 ноября 2011

Один файл размером 2 ГБ передается с сервера на клиент.На стороне клиента, после получения 512 МБ этого файла, я открываю это с помощью:

FILE *fp= fopen("that file","r"); 

Теперь, после завершения загрузки, могу ли я получить доступ ко всем данным 2 ГБ этого файла с помощью этого файлового дескриптора?Или мне нужно заново открыть его для доступа ко всему файлу?

Ответы [ 3 ]

2 голосов
/ 02 ноября 2011

Во-первых, вы должны избегать пробелов в именах файлов Linux. Таким образом, ваш пример должен быть FILE *fp= fopen("that_file","r"); с пробелами (или даже управляющими символами, такими как перевод строки) в именах файлов, это дурной вкус.

А в Linux дескриптор файла (который не a FILE* handle!) Представляет собой небольшое целое число, которое обрабатывается ядром: внутри ядра процессы имеют таблицу открытых файлов и их код приложения ссылается (используя системные вызовы, такие как open и read и т. д.) на эти файлы по дескриптору файла. Стандартная библиотека C управляет буферизацией и файловыми дескрипторами (поэтому внутри структуры данных FILE есть буферы и файловый дескриптор).

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

Так что вам не нужно «обновлять» ваш fp, но ваш код дрянной (из-за отсутствия синхронизации между процессом чтения и записи).

1 голос
/ 02 ноября 2011

Нет необходимости заново открывать файл;если вы периодически запрашиваете размер файла в клиенте, вы увидите, что он увеличивается.Обратите внимание, что файл не увеличивается до тех пор, пока процесс записи не очистит свои буферы.

(A FILE* не дескриптор файла, кстати.)

0 голосов
/ 02 ноября 2011

Дескриптор файла должен быть обновлен для доступа ко всему файлу.Обычно при открытии файла текущее содержимое файла загружается в память и на него ссылается дескриптор файла, а любое обновление внешнего файла не будет обновляться в загруженной памяти.

...