2010-11-13 5 views
2

Je suis intéressé par l'écriture d'un utilitaire qui modifie les fichiers PostScript. Il doit parcourir le fichier, prendre certaines décisions sur le nombre de pages et les dimensions, puis écrire la sortie dans un fichier ou une sortie standard en apportant certaines modifications au code PostScript.Lecture et canalisation de gros fichiers avec C

Quel serait un bon moyen de gérer le traitement de fichiers sur un système * NIX dans ce cas? Je suis assez novice en matière de pipes et de forking en C, et je crois comprendre que, dans le cas d'une lecture directe d'un fichier, je pourrais sans doute rechercher le fichier d'entrée, mais si l'entrée est directement transmise au programme, ne peut pas simplement revenir en arrière au début d'une entrée car l'entrée pourrait être un flux de réseau par exemple, correct? Plutôt que de stocker le fichier PS entier en mémoire, ce qui peut devenir énorme, il semble qu'il serait plus logique de tamponner l'entrée sur le disque lors de mon premier passage d'analyse de page, puis de relire le fichier temporaire , produit la sortie et supprime le fichier temporaire. Si c'est une solution viable, où serait un bon endroit pour stocker un tel fichier sur un système * NIX? Je ne suis pas sûr de la sécurité d'un tel code: le programme pourrait potentiellement être utilisé par plusieurs utilisateurs sur le même serveur. Il semble que je m'assurerais de sauvegarder le fichier quelque part dans un répertoire temporaire propre à un compte d'utilisateur donné et de donner un nom assez unique au fichier temporaire sur le disque.

J'apprécierais tous les conseils et les pointeurs sur ce monde fou de traitement de fichiers.

Répondre

4

Utilisez mkstemp(3) pour créer votre fichier temporaire. Il va gérer les problèmes de concurrence pour vous. mmap(2) vous permettra de vous déplacer dans le fichier avec abandon.

+0

C'est parfait! Bien que je sente que j'évite d'apprendre un peu sur la concurrence de création temporaire de fichiers :) – dmkc

+0

Quelle est la différence entre 'mkstemp' et' mktemp'? – helpermethod

+0

@Helper: Comme indiqué dans la page de manuel 'mktemp (3)', 'mktemp()' a plusieurs problèmes de sécurité. –

1

Si l'entrée est directement canalisée dans le programme, je ne peux pas simplement revenir en arrière au début d'une entrée car l'entrée pourrait être un flux réseau par exemple, correct?

C'est correct. Vous pouvez uniquement effectuer un accès aléatoire sur un fichier. Si vous avez lu le fichier, vous pourriez peut-être créer une table de métadonnées, que vous pouvez utiliser pour rechercher des parties spécifiques du fichier plus tard, sans conserver le fichier lui-même en mémoire./Tmp est le répertoire temporaire sur les systèmes Unix.