2010-11-13 4 views
2

Мне интересно написать утилиту, которая изменяет файлы PostScript. Он должен пересекать файл, принимать определенные решения о количестве страниц и размерах, а затем записывать вывод в файл или stdout, внося некоторые изменения в код PostScript.Чтение больших объемов файлов с помощью C

Что было бы хорошим способом обработки файлов в системе * NIX в этом случае? Я довольно новичок в трубах и разворачивании на C, и я понимаю, что в случае чтения файла напрямую я мог бы искать туда и обратно вокруг входного файла, но если вход напрямую передается в программу, я не может просто перемотать назад в начало ввода, поскольку вход может быть сетевым потоком, например, правильно?

Вместо того, чтобы хранить весь файл PS в памяти, который может расти огромным, кажется, что имеет смысл буферизовать входные данные на диске при выполнении первого анализа страницы, а затем перечитать из временного файла , произвести вывод и удалить временный файл. Если это жизнеспособное решение, где было бы хорошим местом для хранения такого файла в системе * NIX? Я не уверен, насколько безопасен такой код: программа потенциально может использоваться несколькими пользователями на одном сервере. Похоже, я бы обязательно сохранил файл где-то во временном каталоге, уникальном для данной учетной записи пользователя, а также предоставил временному файлу на диске довольно уникальное имя.

Поблагодарили бы за любые советы и указатели в этом сумасшедшем загадочном мире обработки файлов.

ответ

4

Использование mkstemp(3) для создания временного файла. Он будет обрабатывать проблемы параллелизма для вас. mmap(2) позволит вам перемещаться в файле с отказом.

+0

Это замечательно! Хотя мне кажется, что я немного избегаю изучения параллельного создания параллельных файлов :) – dmkc

+0

В чем разница между 'mkstemp' и' mktemp'? – helpermethod

+0

@Helper: Как указано в 'manktp (3)' man, 'mktemp()' имеет несколько проблем безопасности. –

1

Если вход напрямую передается в программу, я не могу просто перемотать назад в начало ввода, поскольку вход может быть сетевым потоком, например, правильно?

Это правильно. Вы можете выполнять произвольный доступ к файлу.

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

1

/tmp - временный каталог в системах unix. Это указано FHS. Он очищается, когда система перезагружается.

Если вам требуется более постоянное хранилище данных, то есть/var/tmp, который не очищается после перезагрузки. Также FHS.

http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

Смежные вопросы