savoir si un fichier est déjà ouvert [C] - C - Programmation
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 ?
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
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
Marsh Posté le 09-07-2003 à 10:50:08
polo021 a écrit : _fileno
|
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
Marsh Posté le 09-07-2003 à 10:56:17
KSauzeRK a écrit : |
Je sais pas si il y a moyen de faire ca . J'espere pour toi.
Marsh Posté le 09-07-2003 à 11:05:55
KSauzeRK a écrit : Bonjour, |
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 : |
Pareil: les flags st_atime, st_mtime et st_ctime (man stat/fstat/lstat)
KSauzeRK a écrit : |
Marsh Posté le 09-07-2003 à 11:55:16
western a écrit : |
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
Marsh Posté le 09-07-2003 à 12:25:28
KSauzeRK a écrit : |
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
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...
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
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
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 !
Marsh Posté le 10-04-2009 à 11:56:16
KSauzeRK a écrit : |
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
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.
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...
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.
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?
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.
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!
Marsh Posté le 10-04-2009 à 20:52:19
Il ne conserve pas le fichier ouvert, purement et simplement.
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
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.