Zwei fragen: Ordnernamen eines ver. auslesen und...
-
hallo leute
ich bin neu in der linux development welt und interessiere mich momentan für zwei antworten der fragen:
1. gibt es unter linux eine möglichkeit auf datei/ordner ereignisse zu reagieren? z.B. create etc. bei windows geht sowas. wenn dies unter linux geht wie genau macht man sowas?
2. wie kann ich die ordnernamen eines verzeichnisses auslesen? z.B. in /home/myname/thedir/ dort möchte ich nun alle darin befindlichen ordnernamen auslesen und in ein array speichern. wie geht sowas?
hoffe ihr könnt mir weiterhelfen.
nutze suse 9.2 und den standard C++ compiler der dabei ist.
-
Zu 1.) Unterlinux gibt es DNotify. Wenn die Linux Sourcen bei dir installiert sind findest du hier Dokumentation: /usr/src/linux/Documentation/dnotify.txt Darüber hinaus gibt es noch fam oder die KDE Klassen zur Dateisystemüberwachung
Zu 2.) opendir/readdir/closedir und stat machen das auf POSIX Ebene. Es gibt dafür natürlich verschiedenste C++ Wrapper wie zum Beispiel QDir.
-
hmm also das erste klingt gut jedoch geht das glaub nur mit dateien oder irre ich da? das zweitere bräuchte ich eigentlich garnicht mehr wenn ersteres gut funktioniert
weil ich kann dann gleich den ordnername der als event "create" ausgelöst wurde in mein array packen. insofern brauche ich das zweite nicht.
jedoch wie kann ich nun das ganze für verzeichnisse realisieren?
-
In Linux sind alles Dateien.
Sogar mit Geräten wird über Dateien kommuniziert.
Auch Ordner sind Dateien.
-
also irgendwie klappt es nicht. ich kriege kein event. hier der code..
//---------------------------------------------------------------------- #define _GNU_SOURCE #include <fcntl.h> #include <signal.h> #include <stdio.h> #include <unistd.h> #include <iostream.h> #include <string.h> //---------------------------------------------------------------------- using namespace std; static volatile int event_fd; //---------------------------------------------------------------------- static void handler(int sig, siginfo_t *si, void *data) { event_fd = si->si_fd; } //---------------------------------------------------------------------- void Write_MySQL() { //blah... } //---------------------------------------------------------------------- int main() { cout << "Watching...\n"; struct sigaction act; int fd; act.sa_sigaction = handler; sigemptyset(&act.sa_mask); act.sa_flags = SA_SIGINFO; sigaction(SIGRTMIN, &act, NULL); fd = open("/root", O_RDONLY); fcntl(fd, F_SETSIG, SIGRTMIN); fcntl(fd, F_NOTIFY, DN_MODIFY|DN_CREATE|DN_MULTISHOT); while(1) { pause(); printf("Got event on fd=%d\n", event_fd); Write_MySQL(); } return 0; } //----------------------------------------------------------------------
-
Nachdem ich das Programm zu C++ geändert habe und das #define rausgenommen habe. Scheint es zu funktionieren. Ich habe mein homeverzeichnis genommen. Ein "touch holger" gibt ein event. Genauso ein "echo huhu > holger". Ein "rm au" ergibt kein event. Es ist auch nicht DN_DELETE angegeben.
-
was bitteschön ist an meinem code nicht C++ ?
und wie wäre es wenn du den geänderten code mal postest?
-
linuxcodernoob schrieb:
was bitteschön ist an meinem code nicht C++ ?
und wie wäre es wenn du den geänderten code mal postest?Das folgende klappt hier:
extern "C" { #include <fcntl.h> #include <signal.h> #include <unistd.h> } #include <iostream> #include <cstring> #include <cstdio> //---------------------------------------------------------------------- using namespace std; static volatile int event_fd; //---------------------------------------------------------------------- static void handler(int sig, siginfo_t *si, void *data) { event_fd = si->si_fd; } //---------------------------------------------------------------------- void Write_MySQL() { //blah... } //---------------------------------------------------------------------- int main() { cout << "Watching...\n"; struct sigaction act; int fd; act.sa_sigaction = handler; sigemptyset(&act.sa_mask); act.sa_flags = SA_SIGINFO; sigaction(SIGRTMIN, &act, NULL); fd = open("/home/ponto/test", O_RDONLY); fcntl(fd, F_SETSIG, SIGRTMIN); fcntl(fd, F_NOTIFY, DN_MODIFY|DN_CREATE|DN_MULTISHOT); while(1) { pause(); printf("Got event on fd=%d\n", event_fd); Write_MySQL(); } return 0; }