2010-01-25 10 views
0

J'ai une situation dans laquelle je dois récupérer des fichiers d'un répertoire et les traiter aussi rapidement qu'ils apparaissent. Le processus d'alimentation des fichiers dans ce répertoire les écrit à un rythme assez rapide (jusqu'à mille par minute aux heures de pointe) et j'ai besoin de les sortir et de les traiter dès leur arrivée. Un problème que j'ai eu est de savoir que mon code C++ a ouvert un fichier avec lequel le serveur d'envoi a fini - c'est-à-dire que le serveur FTP local n'écrit toujours pas.Comment puis-je savoir que je suis la seule personne à avoir une poignée de fichier ouverte?

Sous Solaris, comment puis-je ouvrir un fichier et savoir avec 100% de certitude que personne d'autre ne l'a ouvert?

Je dois noter qu'une fois que le fichier a été écrit et fermé, l'autre serveur ne l'ouvrira plus, donc si je peux l'ouvrir et que je sais que j'ai un accès exclusif, je n'ai pas besoin de m'inquiéter à propos de vérifier que je suis toujours le seul avec le fichier.

+0

ajouté une autre option – stacker

+0

Ou poser cette question sur serverfault.com, les admins peuvent avoir de meilleures idées – stacker

Répondre

0

Est-ce que le processus qui alimente les fichiers dans le répertoire vous appartient? Si tel est le cas, renommez l'extension du fichier en .working afin de ne pas récupérer le fichier en cours d'utilisation.

EDIT: Puisque vous avez dit que c'est solaris, écrivez un script shell et utilisez la commande pfiles pour vérifier si le processus utilise encore le fichier que vous voulez utiliser. Si ce n'est pas le cas, commencez le traitement du fichier.

+0

Non, il ne nous appartient pas. C'est un morceau de matériel tiers qui nous envoie des fichiers FTP. – Andrew

1

Vous pouvez utiliser flock() avec l'opération LOCK_EX pour garantir un accès exclusif. fcntl() est une autre façon possible

#include <sys/file.h> 

int flock(int fd, int operation); 

EDIT: Deux façons de faire, trouver un serveur ftp qui verrouille le fichier lors de la réception. Je crains que vous ne soyez pas sûr à 100% si vous surveillez le processus serveur ftp, en utilisant pfiles ou lsof (qui est disponible ici http://www.sunfreeware.com/) pour vous assurer que personne d'autre n'accède aux fichiers. Peut-être que vous pouvez vérifier l'horodatage des fichiers correspondants et s'ils n'ont pas été modifiés pendant quelques minutes, vous pouvez les récupérer, les traiter ou faire quelque chose en toute sécurité.

+0

qui dépend du serveur ftp - c'est-à-dire, le serveur ftp verrouille-t-il le fichier? ou cela fonctionnera-t-il contre les handles de fichiers déverrouillés mais actifs? –

+0

Dans ce cas, un protocole pourrait être utilisé, et après le transfert des fichiers, un autre fichier appelé 'tx_finished' pourrait être envoyé pour indiquer la fin de la transmission. – stacker

+0

Nous n'avons aucun contrôle sur l'appareil qui envoie les fichiers ... – Andrew