PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Informiert werden, wenn eine Datei geschlossen wird



axeljaeger
16-04-2003, 11:28
Informiert werden, wenn eine Datei geschlossen wird

Ich habe folgendes Problem: Ich möchte eine shared-lib laden, wenn eine solche in ein bestimmtes Verzeichnis kopiert
wird. Die entsprechende Benachrichtigung kriege ich schon durch SGI's FAM. Leider funktioniert das Laden nicht
unmittelbar nachdem FAMCreatedEvent, also wenn die Datei angelegt wurde. Ich nehme an, es liegt daran, das die
shared-lib noch nicht fertig auf die Platte geschrieben wurde und ich deshalb versuche eine unfertige oder womöglich
sogar leere shared-lib zu laden. Ich müsste nun informiert werden, wann die Datei vom Konqueror oder wem auch immer
nach dem Schreiben geschlossen wurde und erst dann anfangen, die lib zu laden. Ich nehme an, das geht wieder in die
Unix-Systemprogrammierung. Fertige Lösungen sind willkommen, aber mich würde uachmal interessiereren, wie ich
selbstständig die Lösung zu solchen Problemen zusammensuchen kann. Gibt es evtl. Bücher, in denen solche Tricks
erklärt sind?

pik7
16-04-2003, 23:16
hallo,

also wenn die PID des Konqueror oder wem auch immer
bekannt ist könnte man folgendes machen.
Im /proc/<PID>/fd nach der Datei suchen mit
readlink();
Im /pro/<PID>/fd stehen alle zur zeit vom Prozess(PID)
geöffnete Filedeskriptoren.
Um an den Namen der Datei zu kommen readlink() benutzen;
Wenn der Prozess dei Datei schliest verschwindet auch der Eintrag
und readlink() liefert einen Fehler.
Muss man sich halt was zusammenstricken.

gruß

axeljaeger
17-04-2003, 12:40
Nun, die ProzessID hab ich leider nicht. Interessanter wäre eine Liste aller offenen Dateien. Da kann ich dann einfach gucken, ob die shares-lib dabei ist und solange warten, bis sie nicht mehr in der Liste ist.

anda_skoa
17-04-2003, 13:05
Der Befehl fuser kann anzeigen, welche Prozesse gerade auf eine Datei zurgeifen.

Ciao,
_

axeljaeger
17-04-2003, 16:14
Hm, einen Befehl fuser gibt es bei mir nicht (Mandrake 8.2). Ich dachte immer, das Kommando, um alle offenen Dateien anzuzeigen hieße lsof, aber auch das gibt es bei mir nicht

anda_skoa
17-04-2003, 16:28
Original geschrieben von axeljaeger
Hm, einen Befehl fuser gibt es bei mir nicht (Mandrake 8.2). Ich dachte immer, das Kommando, um alle offenen Dateien anzuzeigen hieße lsof, aber auch das gibt es bei mir nicht

lsof zeigt, welche Dateien ein Prozess offen hat
fuser zeigt, welche Prozesse eine Datei benutzen.

Bei mir hier unter Debian ist es in /bin, in der Firma unter RedHat in /sbin

Ciao,
_

pik7
17-04-2003, 18:29
hallo,

lsof und fuser benutzen auch das /proc Filesystem
um an ihre Informationen zu kommen.
Um an die PID zu kommen kann man
/proc/PID/cmdline benutzen.
Mal abgesehen davon das man lsof und fuser
auch wieder forken und mit system() oder einem der exec() aus einem C Programm
starten muß und dann wieder den Aufwand hat die Daten ins Programm
zu bekommen.

gruß

axeljaeger
17-04-2003, 18:39
Also, fuser scheine ich auch als root zu haben, lsof nicht. Also steht in /proc irgendwo, welche Datien gerade offen sind? Mal abgesehen davon das ich mit dem Output von "fuser /" nicht viel anfangen kann

anda_skoa
17-04-2003, 18:44
Original geschrieben von pik7
lsof und fuser benutzen auch das /proc Filesystem
um an ihre Informationen zu kommen.


Ja, schon klar.

Man könnte aber im Source von fuser nachsehen, was genau ausgelesen wird.

Ciao,
_

pik7
17-04-2003, 19:20
nochmal hallo,

die offenen Dateien,Pipes und alles was sonst noch
Fildesciptoren benutzt eines Prozesses findet man in
/proc/PID/fd
wenn du denn mc installierst hast kannst du da ja mal mit
reinschauen der zeigt dir dann unten die Datei an oder die Pipe
oder was sonst noch so gibt

gruß

axeljaeger
17-04-2003, 21:03
Das heist, ich muss alle /proc/#/fd nach meiner datei durchwühlen?

pik7
17-04-2003, 21:54
Hier ein Beispiel wie man das machen könnte



#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>

int main()
{
int pid_id,size;
char buffer[256];
DIR *fd_dir;
struct dirent *dir;

printf("PID eingeben\n");
scanf("%d" ,&pid_id);
sprintf(buffer,"/proc/%d/fd",pid_id);

printf("Offene Dateien:\n");
fd_dir=opendir(buffer);

while((dir=readdir(fd_dir))!=NULL) {
if((strstr(dir->d_name,"."))!=NULL) continue;
sprintf(buffer,"/proc/%d/fd/%s",pid_id,dir->d_name);
size=readlink(buffer,buffer,255);
buffer[size]='\0';
printf("%s\n" ,buffer);
}

return 1;

}


Das sucht jetzt alle offene Dateien die ein Prozess
mit der eingegebnen PID hat.

Wenn man nach den offenen Dateien für ein Programm sucht
dessen Name bekannt ist kann man auch vorher noch
/proc/PID/cmdline oder /proc/PID/status auswerten um zu schauen
ob das überhaupt das ist was man braucht bevor man
ins fd Verzeichnis wechselt.

gruß

axeljaeger
17-04-2003, 21:58
Ja, das wissen wir halt nicht, welches Programm das ist. Das könnte der cp-Befehl sein, Nautilus, Konqueror, alles Mögliche, was Dateien kopieren und schreiben kann. Sogar der g++ könnte die .so direkt in das Verzeichnis schreiben