Programmorder feststellen

Dieses Thema im Forum "C/C++" wurde erstellt von BetaWolf, 13.03.2009.

  1. #1 BetaWolf, 13.03.2009
    BetaWolf

    BetaWolf Grünschnabel

    Dabei seit:
    10.03.2007
    Beiträge:
    8
    Zustimmungen:
    0
    Wie kann ich feststellen in einem Programm feststellen wo es sich selbst befindet? Ich würde gerne einige Dinge unabhängig von wo das Programm gestartet wird aus dem Programmordner laden.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. glako

    glako Eala Frya Fresena!

    Dabei seit:
    27.05.2007
    Beiträge:
    161
    Zustimmungen:
    0
    Ort:
    umme Ecke
    Code:
    whereis Programmname
    In die Konsole / das Terminal eingeben
     
  4. #3 Gott_in_schwarz, 13.03.2009
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Code:
    man 3 getcwd
     
  5. #4 floyd62, 13.03.2009
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Denke, du kannst über argv[0] feststellen, wie das Programm aufgerufen wurde. Falls ein absoluter Pfad angegeben wurde, kannst du mit dirname() den Programmordner direkt rausfinden; wenn '/' in argv[0] enthalten ist (Aufruf erfolgte über relative Pfadangabe), erstmal mit chdir in das entsprechende Verzeichnis wechseln, dort liefert dann getcwd(), wo du bist; und falls nur der Programmname selbst in argv[0] steckt, musst du über $PATH suchen, bis du das Programm findest ...

    Wenn du zufällig auf Linux unterwegs sein solltest ;-), kannst du auch über das /proc-FS (-> /proc/self/exe) feststellen, welches Programm du eigentlich ausführst; der dirname() davon sollte dir das Gewünschte liefern.
     
  6. #5 Gott_in_schwarz, 13.03.2009
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Ah, ich hatte das anders verstanden. Dann wäre das proc-fs tatsächlich der Weg.
    Der Inhalt von argv[0] ist (afair) weder vom c-std noch von POSIX garantiert. Von daher ist proc wohl der bessere Weg.
    Aber dirname macht afaik keine link-resolution, sondern stupides string-parsing. readlink wäre eine Idee.
     
  7. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  8. #6 floyd62, 13.03.2009
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Hi Gott_in_schwarz,

    doch, ich glaube argv ist Teil des C-Standards; siehe z.B. http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1362.pdf. Und im Gegensatz zu /proc funktioniert das auch auf Nicht-Linux-Plattformen.

    Und wenn es nur darum geht, festzustellen, aus welchem Verzeichnis ein Programm aufgerufen wurde, um von dort z.B. Standardeinstellungen aus einem Konfig-File nachzuladen - so habe ich die Aufgabenstellung verstanden - wäre mir relativ egal, ob in den Namen noch irgendwelche Links enthalten sind ;-)

    Grüsse
     
  9. #7 Gott_in_schwarz, 13.03.2009
    Zuletzt bearbeitet: 13.03.2009
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Möglichkeiten:
    argc == 0:
    argv[0] == NULL

    oder
    argc > 0:
    argv[0] entweder Programmname oder ""

    Also ist das nicht vom Standard abgedeckt.

    Das gilt natürlich genauso fürs procfs.
    Btw, dirname("/proc/self/exe", ...) ergibt "/proc/self". Ich denke mal du siehst ein wieso man für die proc-Lösung readlink und nicht (nur) dirname verwenden sollte.

    Ein weiteres (ziemlich unschönes) Problem beim "argv[0]-approach" ist (was du auch bereits angesprochen hast), dass das Programm eventuell "pfadlos" aufgerufen wurde. Dann darf man lustig PATH durchsuchen.
    Ich würd sagen die proc-Methode ist transparenter und, zumindest auf bestimmten unixoiden Betriebssystemen, verlässlicher.

    Aber mich würde auch mal interessieren, obs da einen "portablen" Weg gibt.

    edit:
    Ein weiteres Problem mit argv[0] und PATH wäre die Möglichkeit, dass die binary in irgendeinem Ordner "außerhalb" der PATH-Variable liegt, aber ein Softlink in einem der PATH-Pfade vorliegt. Dann muss man PATH dursuchen und readlink (eventuell sogar mehrfach) benutzen.
    Consider:
    Code:
    $ cd /home/user
    $ cat readlink.c 
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <libgen.h>
    
    int main(int argc, char *argv[]) {
        char buf[1024];
        char *dname;
        int len;
        if ((len = readlink("/proc/self/exe", buf, sizeof(buf)-1)) != -1) {
            buf[len] = '\0';
        }
        printf("readlink(\"/proc/self/exe\", ...)\t== %s\n", buf);
        printf("dirname(\"%s\", ...)\t== ", argv[0]);
        dname = dirname(argv[0]);
        printf("%s\n", dname);
        return EXIT_SUCCESS;
    }
    $ gcc readlink.c -o readlink
    $ ln -s /home/user/readlink /bin/MY_READLINK
    $ cd /
    $ MY_READLINK 
    readlink("/proc/self/exe", ...) == /home/user/readlink
    dirname("MY_READLINK", ...)     == .
    Und das Beispiel ist nichtmal sonderlich unwahrscheinlich.
    Code:
    $ ls -lah /usr/bin/cc
    lrwxrwxrwx 1 root root 20 2008-01-27 02:11 /usr/bin/cc -> /etc/alternatives/cc*
    $ ls -lah /etc/alternatives/cc
    lrwxrwxrwx 1 root root 12 2008-01-27 02:11 /etc/alternatives/cc -> /usr/bin/gcc*
    $ ls -lah /usr/bin/gcc
    lrwxrwxrwx 1 root root 7 2008-01-27 02:11 /usr/bin/gcc -> gcc-4.1*
    edit:
    Wow, das geht sogar noch besser als ich dachte:
    Code:
    $ cd /home/user && mv readlink foo/
    $ ln -s /home/user/foo/readlink /home/user/readlink
    $ ls -lah /bin/MY_READLINK
    lrwxrwxrwx 1 root root 21 2009-03-13 19:01 /bin/MY_READLINK -> /home/user/readlink*
    $ ls -lah readlink
    lrwxrwxrwx 1 user user 25 2009-03-13 19:56 readlink -> /home/user/foo/readlink*
    $ MY_READLINK 
    readlink("/proc/self/exe", ...) == /home/user/foo/readlink
    dirname("MY_READLINK", ...)     == .
    Also nimmt /proc/self/exe einem die Arbeit mit mehrfachen Softlinks ab.
     
Thema:

Programmorder feststellen

Die Seite wird geladen...

Programmorder feststellen - Ähnliche Themen

  1. Mit Live-CD Linux-Tauglichkeit eines Notebooks feststellen

    Mit Live-CD Linux-Tauglichkeit eines Notebooks feststellen: Hallo zusammen, eine Bekannte war mit dem Zwangsupdate auf Windows 10 bei Ihrem Notebook (Toshiba Satellite mit AMD-Prozessor und AMD Radeon...
  2. Debian 6 - wie Zugriffsverweigerungen feststellen?

    Debian 6 - wie Zugriffsverweigerungen feststellen?: Hallo! Ich habe auf einem Rechner smsservertools3 laufen und weil ich mir selber ein Webfrontend gebastelt habe, habe ich für apache die Rechte...
  3. Wie feststellen, ob ein programm 1 oder alle Kerne nutzt ?

    Wie feststellen, ob ein programm 1 oder alle Kerne nutzt ?: Hallo Wie die Überschrift schon suggeriert, wie kann ich feststellen, wieviele, oder ob überhaupt, Kerne ein Programm benutzt ? mfg...
  4. Feststellen ob Debian Server neustart benötigt

    Feststellen ob Debian Server neustart benötigt: Hi Leute, Habe mal wieder eine Frage an euch, wie kann ich auf einem Debianserver nach der Installation von Updates feststellen ob ein Neustart...
  5. Datei Nummerierungslücken feststellen

    Datei Nummerierungslücken feststellen: In einem Directory habe ich eine Anzahl von Files, in deren Namen unter anderem eine Durchnummerierung enthalten ist. Beispiele: FGDSTC004.trf...