Linux-Befehle im C++ Program..!



  • Hallo,
    hätte ne Frage an euch...
    ...kann man in einem c/c++ Programm Linux-Befehle "miteinbauen"..?
    Also so ganz normale Befehle wie z.B. ls, cd, pwd usw...!
    Wenn ja...dann wie..?

    Danke schon im voraus..!

    !..MFG Bonafide..!



  • Kommt drauf an, was du machen willst.
    Einfach ausführen kannst du mit system. (Oder exec*)
    Sonst gibts für jeden Befehl auch eine C-Funktion...
    Für "cd" zB das chdir aus unistd.h



  • Danke für deine Antwort legalopex.
    Will zum Beispiel die Liste von ls -lu (Also die Liste die anzeigt wann zuletzt an einem Ordner zugegriffen wurde) mit einem C/C++ Prog aufrufen und dann bearbeiten...z.B. sortieren, ändern usw..!



  • mach das besser mit einem Shell Skript und starte das Skript dann von deinem C Programm



  • Danke für den Rat, aber ich hätte das gerne gleich im C/C++ Prog.



  • lagalopex schrieb:

    Einfach ausführen kannst du mit system. (Oder exec*)

    Und wie genau geht es..?
    z.B. für ls schreibe ich

    system("ls");
    

    oder wie..?



  • So würde die Ausgabe dann einfach auf der Konsole landen.
    Wenn du die Ausgabe natürlich brauchst, schau dir mal popen an.
    Wobei vieles mit einem Script leichter zu lösen ist...





  • 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 😮


Anmelden zum Antworten