Linux-Befehle im C++ Program..!





  • Danke für eure Hilfe...!

    Babyentenwickler schrieb:

    Schau dir das mal an:
    http://www.koders.com/c/fid4DCA9588BF1A4DA19B1A2D5C139BAE53F5348A8F.aspx

    Leider bin ich noch ein relativer anfänger in C/C++ und kann nicht viel mit diesem Code anfangen.
    Wie kann ich denn informationen vom Befehel ls den rausfiltern..?
    Mich interessiert zum Beispiel nur die Zeit vom Befehl ls -lu. Wie kann ich die rausfiltern..?
    Und könntet ihr mir vielleicht ein link posten mit dem Befehl popen, weil in google hab ich leider nicht viel über das finden können (nichts, was mich weiterbringt).



  • Ich sagte ja, kommt drauf an, was du willst.

    Geb mal "man popen" in der Konsole ein.

    Aber wenns nur eine bestimmte Datei ist "man stat".



  • lagalopex schrieb:

    Ich sagte ja, kommt drauf an, was du willst.

    Ich will ein prog erstellen, dass von dem Inhalt eines Ordners die (last access time - atime), (last modification time - mtime) und (last status change time - ctime) "speichert", nach Zeit sortiert und dann sortiert "printet". Also zum Beispiel in einem Ordner mit name "NEU" gibt es folgendes (Inhalt): text.txt, song.mp3, code.c, word.doc,usw...
    Das Prog soll jetzt die atime, mtime und ctime abrufen sortieren und drucken (also auf der Konsole).
    Also in diesem Fall:
    18.05.07 09:56:23 [song.mp3] mtime, ctime
    18.05.07 09:55:45 [word.doc] atime, mtime, ctime
    18.04.07 10:16:01 [code.c] mtime, ctime
    16.04.07 11:16:08 [text.txt] atime
    19.03.07 16:19:16 [song.mp3] atime
    .
    .
    .
    usw...
    Hoffe du hast verstanden was ich meine und kannst mir weiterhelfen..!



  • Also du kannst mit opendir (man opendir) und readdir (man readdir) alle Dateinamen in Erfahrung bringen. Da ruft man dann für jede Datei stat (man 2 stat) auf und hat dann alle Daten beisammen.

    Das Sortieren kriegt man mit den stl's von c++ auch recht leicht hin.

    Für die Ausgabe kann man dann die Zeiten noch mit localtime und strftime ins gewünschte Format bringen.



  • Danke dir erstmal sehr für deine schnelle Antwort..!
    Hast mich schon weitergebracht..!
    Also so wie ich das richtig verstehe kann ich mit opendir die Verzeichnissdatei öffnen und da wird noch ein Zeiger auf den ersten Eintrag des Verzeichnisses geliefert. Mit ersten Eintrag des Verzeichnisses meint er die erste Datei vom Inhalt..?
    Also so wie ich das jetzt verstehe wäre mein code so:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <dirent.h>
    
    int main(void){
        	DIR *opendir(const char *NEU);
    	return 0;
        	}
    

    Also bin ich jetzt "auf" der ersten Datei im Ordner NEU..?



  • Ich glaube so langsam, dass du erstmal die Sprachen an sich lernen solltest... 🙄

    #include <sys/types.h>
    #include <dirent.h>
    #include <linux/unistd.h>
    
    :
    
    	DIR *d;
    	struct dirent* dirp;
    	if ((d = opendir("abc"))) {
    		while ((dirp = readdir(d)) != 0) {
    			/* Mach was mit den Daten in d, also stat und in eine Liste packen*/
    		}
    	}
    


  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • lagalopex schrieb:

    #include <sys/types.h>
    #include <dirent.h>
    #include <linux/unistd.h>
    
    :
    
    	DIR *d;
    	struct dirent* dirp;
    	if ((d = opendir("abc"))) {
    		while ((dirp = readdir(d)) != 0) {
    			/* Mach was mit den Daten in d, also stat und in eine Liste packen*/
    		}
    	}
    

    Könntest du das näher erklären, verstehe den Code nicht so ganz..?



  • Bonafide schrieb:

    lagalopex schrieb:

    #include <sys/types.h>
    #include <dirent.h>
    #include <linux/unistd.h>
    
    :
    
    	DIR *d;
    	struct dirent* dirp;
    	if ((d = opendir("abc"))) {
    		while ((dirp = readdir(d)) != 0) {
    			/* Mach was mit den Daten in d, also stat und in eine Liste packen*/
    		}
    	}
    

    Könntest du das näher erklären, verstehe den Code nicht so ganz..?

    Also das "DIR d;" erstellt nen Zeiger (für Verzeichnisse).
    Das opendir weißt dem Zeiger dann das Verzeichnis "abc" zu oder null im Fehlerfall.
    "struct dirent
    dirp;" ist ein Zeiger (diesmal für eine enthaltende Datei).
    readdir ließt nun immer den nächsten Dateieintrag von d ein (oder null, falls keine Datei mehr da ist...).

    Aber wie schon eingangs gesagt. Lern erstmal die Grundlagen und ließ die man-pages, da steht _alles_ drin zu den Funktionen.



  • Vielleicht hilft dir dieses Buch weiter?

    http://www.cpp-entwicklung.de/cpplinux3/cpp_main/cpp_main.html

    Dort steht ein schönes Beispiel:

    http://www.cpp-entwicklung.de/cpplinux3/cpp_main/cpp_mainch3.html#x4-2030003.2.5

    Und das funktioniert sogar!



  • Thx für die Erklärung legalopex..!
    Ich verstehe aber immer noch nicht wie ich das mit stat machen kann und wie ich dann die infos speichern kann. z.B. wenn ich "stat %x erga" eintippe, wobei erga eine Datei ist kommt dann folgendes:
    stat: Aufruf von stat für „[%x]“ nicht möglich: Datei oder Verzeichnis nicht gefunden
    File: „erga.c“
    Size: 125 Blocks: 16 IO Block: 4096 reguläre Datei
    Device: 817h/2071d Inode: 85106 Links: 1
    Access: (0644/-rw-r--r--) Uid: ( 1000/Bonafide) Gid: ( 100/ users)
    Access: 2008-03-13 14:13:12.000000000 +0200
    Modify: 2008-03-13 13:53:33.000000000 +0200
    Change: 2008-03-13 13:53:33.000000000 +0200
    Wieso..?
    Was mache ich falsch..?
    Mein Problem wäre ja dann immer noch wie ich denn, die Acces, Modify und Change time speichern kann.
    Kann man das irgendwie rausfiltern, so dass ich nur die drei habe also nur acces, modify und change..!



  • In der man-page von man: stat(2) steht, wie man es benutzt!

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    :
    /*
    int stat(const char *path, struct stat *buf);
    
    struct stat {
        dev_t     st_dev;     // ID of device containing file
        ino_t     st_ino;     // inode number
        mode_t    st_mode;    // protection
        nlink_t   st_nlink;   // number of hard links
        uid_t     st_uid;     // user ID of owner
        gid_t     st_gid;     // group ID of owner
        dev_t     st_rdev;    // device ID (if special file)
        off_t     st_size;    // total size, in bytes
        blksize_t st_blksize; // blocksize for filesystem I/O
        blkcnt_t  st_blocks;  // number of blocks allocated
        time_t    st_atime;   // time of last access
        time_t    st_mtime;   // time of last modification
        time_t    st_ctime;   // time of last status change
    };
    */
    :
    struct stat stats;
    if (stat("test", &stats) == -1) {
        perror("stat");
        return 1;
    }
    printf("Letzter Zugriff auf \"test\" %lu Sekunden seit 1970\n", stats.st_atime);
    

    PS: Mein Nick heißt lagalopex... das alle immer erst an legal denken müssen 😮



  • lagalopex schrieb:

    PS: Mein Nick heißt lagalopex... das alle immer erst an legal denken müssen 😮

    Sorry, hab es falsch abgeschreieben..! 🙄
    DANKE dir SEHR für deine Antwort. Habe auch endlich verstnaden was das man mit struct gemeint hat, also wie man das benutzen kann.

    Könnte man daraus aber das volle Datum entziehen und nicht die Sekunden..?



  • Bonafide schrieb:

    Könnte man daraus aber das volle Datum entziehen und nicht die Sekunden..?

    lagalopex schrieb:

    Für die Ausgabe kann man dann die Zeiten noch mit man: localtime und man: strftime ins gewünschte Format bringen.

    Ein Beispiel steht unten auf der manpage von strftime.



  • Also so wie ich das verstanden habe, geht die Umwandlung so:

    struct tm *date;
    date=localtime(&stats.st_mtime);
    

    Ist der Gedanke richtig..?
    Oder total falsch..?
    Und wenn es richtig sein sollte, wie kann ich denn das "printen"..?



  • Bonafide schrieb:

    Also so wie ich das verstanden habe, geht die Umwandlung so:

    struct tm *date;
    date=localtime(&stats.st_mtime);
    

    Ist der Gedanke richtig..?

    ja 🙄

    Bonafide schrieb:

    Und wenn es richtig sein sollte, wie kann ich denn das "printen"..?

    Welche Variablen enthält denn die struct vom Typ tm?
    Ein bischen mehr Eigeninitiative wäre wirklich angebracht und vielleicht einfach mal etwas rumprobieren... 😮



  • lagalopex schrieb:

    Ein bischen mehr Eigeninitiative wäre wirklich angebracht und vielleicht einfach mal etwas rumprobieren... 😮

    Naja rumprobiert habe ich schon..!

    lagalopex schrieb:

    Welche Variablen enthält denn die struct vom Typ tm?

    struct tm {
    int tm_sec; /* seconds /
    int tm_min; /
    minutes /
    int tm_hour; /
    hours /
    int tm_mday; /
    day of the month /
    int tm_mon; /
    month /
    int tm_year; /
    year /
    int tm_wday; /
    day of the week /
    int tm_yday; /
    day in the year /
    int tm_isdst; /
    daylight saving time */
    };
    Ich hätte das ja auch so geschreiben:

    struct tm *date;
    date=localtime(&stats.st_mtime); 	
    printf("%d-%d-%d %d:%d:%d\n",*date.tm_year,*date.tm_mon,*date.tm_day,*date.tm_hour,*date.tm_min,*date.tm_sec);
    

    Aber das funktioniert ja nicht, also ist hier irgendwo ein gedankenfehler bei dem *date.tm_year...
    Beim Compilen kommt ja immer der Fehler:
    request for member ‘tm_year’ in something not a structure or union...usw..!



  • Bonafide schrieb:

    lagalopex schrieb:

    Ein bischen mehr Eigeninitiative wäre wirklich angebracht und vielleicht einfach mal etwas rumprobieren... 😮

    Naja rumprobiert habe ich schon..!

    Dann schreibs das nächste mal hinzu. 😉

    Bonafide schrieb:

    Ich hätte das ja auch so geschreiben:

    struct tm *date;
    date=localtime(&stats.st_mtime); 	
    printf("%d-%d-%d %d:%d:%d\n",*date.tm_year,*date.tm_mon,*date.tm_day,*date.tm_hour,*date.tm_min,*date.tm_sec);
    

    Dann schau dir nochmal die Operatoren (Priorität) an und wie man speziell mit Zeigern auf struct umgehen kann:

    (*date).tm_year
    date->tm_year
    

    Sollte beides gehen 😉



  • Thx, hat funktioniert..! 🙂
    Er zeigt das Datum richtig an, nur dass da immer das falsche jahr rauskommt und der falsche Monat, Uhrzeit wird korrekt angezeigt..!
    Also zum Beispiel für die Datei "erga" wenn ich "ls -lu erga" im Terminal tippe kommt folgendes raus:
    -rwxr-xr-x 1 Bonafide users 10809 15. Mär 01:38 erga

    Mit dem Testprog, wo printf so ausieht:

    printf("Datum: %d-%d-%d %d:%d:%d\n",(*date).tm_year,(*date).tm_mon,(*date).tm_mday,(*date).tm_hour,(*date).tm_min,(*date).tm_sec);
    

    wird folgendes angezeigt:
    Datum: 108-2-15 1:38:49
    wobei ja der erste Wert 2008 hiessen sollte und nicht 108 und der zweite Wert 3 und nicht 2.
    Wo ist denn da der Fehler..?
    Komisch finde ich auch das ja wie schon oben "gezeigt" bei dem "ls -lu erga"-Befehl 10809 15. Mär 01:38 erga
    angezeigt wird und nicht
    2008 15. Mär 01:38 erga .
    Es sei denn die Zahl 10809 ist was anderes und hat mit dem Datum nix tun..!


Anmelden zum Antworten