[C] savoir si un fichier est déjà ouvert

savoir si un fichier est déjà ouvert [C] - C - Programmation

Marsh Posté le 09-07-2003 à 10:19:59    

Bonjour,
 
2 questions, (sous UNIX, en C / Script Shell) :  
 
- Y'a-t-il un moyen de savoir si un fichier est ouvert par une autre application?  
 
Le contexte : sur un serveur UNIX, je dois surveiller l'arrivée de fichiers dans un répertoire donné. Ces fichiers sont accompagnés d'un fichier "flag" qui signale la fin du transfert. Je dois vérifier que chaque fichier est bien accompagné de son fichier flag, sinon il faut signaler l'erreur. Donc, en script shell, je liste les fichiers, et vérifie la présence du fichier flag. Seulement, le fichier peut être en cours de transfert, dans ce cas je ne dois pas signaler d'erreur. Donc je voudrais savoir s'il y'a moyen de savoir si le fichier est ouvert par une autre application.
 
- Y'a-t-il un moyen de savoir depuis combien de temps un fichier est dans un répertoire donné ?  
 
Merci.

Reply

Marsh Posté le 09-07-2003 à 10:19:59   

Reply

Marsh Posté le 09-07-2003 à 10:32:33    

Et si tu tentes d'ouvrir en écriture le fichier ouvert par une autre appli, ça échoue non ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-07-2003 à 10:37:09    

HelloWorld a écrit :

Et si tu tentes d'ouvrir en écriture le fichier ouvert par une autre appli, ça échoue non ?


 
J'y avais pensé, mais en tentant en C un open en mode O_RDONLY, O_WRONLY et O_RDWR sur un fichier en train d'"arriver" par FTP, les 3 passent...merci quand même

Reply

Marsh Posté le 09-07-2003 à 10:40:58    

_fileno
 

Citation :

The result is undefined if stream does not specify an open file.


 
ca peut peut etre t'aider [:spamafote]

Reply

Marsh Posté le 09-07-2003 à 10:50:08    

polo021 a écrit :

_fileno
 

Citation :

The result is undefined if stream does not specify an open file.


 
ca peut peut etre t'aider [:spamafote]


 
Merci, j'ai regardé le man, mais euh...pour lui filer un stream correspondant au fichier, faut bien que je fasse un fopen non? du coup le fichier sera fortement ouvert...me trompe-je? A moins que je puisse juste associer un FILE à un fichier sans l'ouvrir :??:

Reply

Marsh Posté le 09-07-2003 à 10:56:17    

KSauzeRK a écrit :


A moins que je puisse juste associer un FILE à un fichier sans l'ouvrir :??:  


Je sais pas si il y a moyen de faire ca . J'espere pour toi.[:spamafote]

Reply

Marsh Posté le 09-07-2003 à 11:05:55    

KSauzeRK a écrit :

Bonjour,
 
2 questions, (sous UNIX, en C / Script Shell) :  
 
- Y'a-t-il un moyen de savoir si un fichier est ouvert par une autre application?  


Lors qu'un fichier est ouvert, il y a des flags qui sont positinnés, donc il faut les vérifier (man stat/fstat/lstat, je crois)

KSauzeRK a écrit :


Le contexte : sur un serveur UNIX, je dois surveiller l'arrivée de fichiers dans un répertoire donné. Ces fichiers sont accompagnés d'un fichier "flag" qui signale la fin du transfert. Je dois vérifier que chaque fichier est bien accompagné de son fichier flag, sinon il faut signaler l'erreur. Donc, en script shell, je liste les fichiers, et vérifie la présence du fichier flag. Seulement, le fichier peut être en cours de transfert, dans ce cas je ne dois pas signaler d'erreur. Donc je voudrais savoir s'il y'a moyen de savoir si le fichier est ouvert par une autre application.
 
- Y'a-t-il un moyen de savoir depuis combien de temps un fichier est dans un répertoire donné ?  


Pareil: les flags st_atime, st_mtime et st_ctime (man stat/fstat/lstat)


 :ange:

Reply

Marsh Posté le 09-07-2003 à 11:55:16    

western a écrit :


Lors qu'un fichier est ouvert, il y a des flags qui sont positinnés, donc il faut les vérifier (man stat/fstat/lstat, je crois)
 
Pareil: les flags st_atime, st_mtime et st_ctime (man stat/fstat/lstat)
 
 :ange:  


 
merci, st_ctime contient l'information dont j'ai besoin pour savoir depuis quand le fichier a été déplacé / copié dans le répertoire en cours. Faudra que je vérifie le genre d'accès qui sont faits sur le fichier par contre, pour voir si c'est susceptible de modifier la valeur.
 
Par contre, je vois pas dans la structure stat ce qui se rapporte aux nombre d'ouvertures en cours sur le fichier :??:

Reply

Marsh Posté le 09-07-2003 à 12:25:28    

KSauzeRK a écrit :


Par contre, je vois pas dans la structure stat ce qui se rapporte aux nombre d'ouvertures en cours sur le fichier :??:  


Je me rappelle plus (j'ai eu besoin de faire exactement la meme chose il y a 3 ou 4 ans) mais c'est une autre fonction qui marche comme fstat ...  
essaye de faire une recherche avec man et option -k ...
ou regarde les valeurs possibles de l'ERRNO, des fois que tu trouve une correspondant à un fichier déjà ouvert, ensuite, trouve la fonction (man -k ...) qui l'utilise

Reply

Marsh Posté le 09-07-2003 à 13:13:47    

1) jete un oeil à man fuser
2) sinon il faut passer par fcntl (je regarde si j'ai le temps de te préparer un exemple
 
edit: quoi que je sais pas si on peut faire ça avec fcntl. je regarde en détail le man
 
la solution c'est aussi de regarder si ton appli qui ecrit le fichier peut le vérouiller: mais si t'as pas acces à son code...
 
je suis entrain de chercher une manière propre et atomique au niveau du système. sinon tu as toujours la possiblité de te balader dans /proc...


Message édité par Taz le 09-07-2003 à 13:23:31
Reply

Marsh Posté le 09-07-2003 à 13:13:47   

Reply

Marsh Posté le 09-07-2003 à 13:43:44    

non en fait je vois pas de solution unilatéral avec fcntl. pour avoir des verous non-coopératif, il faut changer les options de mount, et changer les droits sur ton fichier

Reply

Marsh Posté le 09-07-2003 à 13:53:08    

j'ai aps compris votre histoire avec _fileno, j'ai pas le man. pour la solution de stat, je comprends pas non plus. moi j'ai l'impression qu'il n'y a pas de bonne solution (ça ne fonctionne que sous linux (non-POSIX): remount, etc, et c dangereux, meme le root ne peut rien faire) mis à part des appli qui coopérent. apparemment ce n'est pas le cas: donc à toi de tenter ta chance de manière pas atomique

Reply

Marsh Posté le 09-07-2003 à 14:10:56    

++Taz a écrit :

j'ai aps compris votre histoire avec _fileno, j'ai pas le man. pour la solution de stat, je comprends pas non plus. moi j'ai l'impression qu'il n'y a pas de bonne solution (ça ne fonctionne que sous linux (non-POSIX): remount, etc, et c dangereux, meme le root ne peut rien faire) mis à part des appli qui coopérent. apparemment ce n'est pas le cas: donc à toi de tenter ta chance de manière pas atomique


 
Merci d'avoir cherché, j'avais regardé le man de fcntl aussi, ca me semblait pas possible.
 
Mais en fait je crois que fuser correspond à ce que je veux: il me permet de savoir si le fichier est utilisé par un processus, a priori c'est nickel. J'ai testé avec un fichier transferé par FTP, ca fonctionne.
 
Pour le stat, c'était pour la 2ème question : savoir depuis combien de temps un fichier se trouve dans un répertoire donné (normalement il y arrive par un mv ou cp) : le champ st_ctime a l'air de convenir.
 
Le fileno : euh ... c'était une piste un peu tordue en se servant du fait que fileno a un comportement indeterminé si le fichier renseigné par le FILE n'est pas ouvert...
 
Mais bon en fin de compte, savoir si le fichier est utilisé par un autre processus devrait suffire, donc fuser = nickel  :)  
 
Merci à tous ceux qui ont répondu !

Reply

Marsh Posté le 10-04-2009 à 11:56:16    

KSauzeRK a écrit :


 
Merci d'avoir cherché, j'avais regardé le man de fcntl aussi, ca me semblait pas possible.
 
Mais en fait je crois que fuser correspond à ce que je veux: il me permet de savoir si le fichier est utilisé par un processus, a priori c'est nickel. J'ai testé avec un fichier transferé par FTP, ca fonctionne.
 
Pour le stat, c'était pour la 2ème question : savoir depuis combien de temps un fichier se trouve dans un répertoire donné (normalement il y arrive par un mv ou cp) : le champ st_ctime a l'air de convenir.
 
Le fileno : euh ... c'était une piste un peu tordue en se servant du fait que fileno a un comportement indeterminé si le fichier renseigné par le FILE n'est pas ouvert...
 
Mais bon en fin de compte, savoir si le fichier est utilisé par un autre processus devrait suffire, donc fuser = nickel  :)  
 
Merci à tous ceux qui ont répondu !


 
Comment fais-tu pour utiliser ce fuser?
J'ai essayé de créer un fichier vide avec touch test.txt
Puis je l'ai ouvert avec pico : pico test.txt
Et avec une autre session, j'ai fait un fuser test.txt
 
Je n'ai aucun retour. Pourtant le fichier est bien ouvert en écriture...
 
J'ai essayé avec sudo aussi et rien...
 
Sais-tu ce que je fais mal?
 
Merci
 

Reply

Marsh Posté le 10-04-2009 à 13:27:59    

Rien de standard a ma connaissance (ni C, ni POSIX); mais cherche apres lsof, ca fait ce que tu veux -- je ne sais pas avec quel ampleur la portabilite est sacrifiee; la version disponible ici ne semble pas suid root, c'est deja ca.
 
Au contraire de Windows, ouvrir un fichier deja ouvert ne pose generalement pas de probleme sous POSIX (certains unix ont du "mandatory locking", chercher dans leur doc comment le mettre en place).
 
_fileno, ce ne serait pas encore du Windows ca?  En prime, je parie qu'il s'agit de quelquechose purement local au process.  Si c'est sense etre l'equivalent du POSIX fileno, ca passe d'un stream (alias FILE*) a un descripteur de fichier et c'est bien purement local au process, ca n'indique rien globalement.

Reply

Marsh Posté le 10-04-2009 à 14:58:16    

Avec lsof, ça ne remonte pas non plus mon fichier.
 
J'ai fait ça :
lsof | grep test.txt  et rien...

Reply

Marsh Posté le 10-04-2009 à 15:08:53    

Essaye autre chose qu'un éditeur de texte, car je doute fortement que pico maintienne un descripteur en écriture une fois le fichier ouvert et lu en mémoire.

Reply

Marsh Posté le 10-04-2009 à 15:15:12    

Qu'est-ce qu'un descripteur en écriture exactement?
Comment savoir si une appli le maintient ou pas?
Est-ce qu'un transfert ftp le maintient?

Reply

Marsh Posté le 10-04-2009 à 17:19:22    

HyperCed a écrit :

Qu'est-ce qu'un descripteur en écriture exactement?


 
Une valeur retournee par open avec un flag O_WRONLY ou O_RDWR (ou creat, ou une fonction des sockets j'en oublie peut-etre encore) et non encore passee a close.
 

Citation :

Comment savoir si une appli le maintient ou pas?


lsof me semble la methode la plus simple.

Citation :

Est-ce qu'un transfert ftp le maintient?


Je ne vois pas de raison pour un client ou un serveur FTP ecrivant un fichier de ne pas le garder ouvert jusqu'a ce que le transfert soit termine.  Naturellement, on est sur de rien.

Reply

Marsh Posté le 10-04-2009 à 17:26:10    

Ca fonctionne avec du ftp.
 
Génial!
 
Donc pico fait quoi, il ouvre le fichier, puis le met en RAM?
Et vire son flag d'écriture ou de lecture?
 
Ah oui, il doit juste mettre son flag d'écriture au moment de l'enregistrement et l'enlever juste après!!!
 
Ok, merci, j'ai tout compris!

Reply

Marsh Posté le 10-04-2009 à 20:52:19    

Il ne conserve pas le fichier ouvert, purement et simplement.

Reply

Marsh Posté le 05-10-2009 à 18:16:36    

Moi ce que je faisais dans un cas où moi aussi un programme devait récupérés des fichiers envoyés d'ailleurs : je faisais une première boucle où je stockais les cksum de chaque fichier présent, et je faisais une pause de 1 ou 2s, et ensuite, je refaisais une boucle, sur les fichier de ma liste. tous ceux dont le cksum n'avait pas changé, c'est qu'ils étaient terminés. dans ton cas, si le cksum n'a pas changé, tu n'as qu'a vérifier qu'un fichier .flag est présent, et tada. Mais bon, en lisant en diagonale, j'ai vu que d'autres solutions plus propres t'ont été proposées :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed