Verständnis execve



  • Hi Community,
    ich befasse mich gerade ein wenig mit der C Programmierung unter Linux. (Hoffe das ich das hier im C++ Forum posten darf.)
    Ich versuche gerade den systemcall execve zu verstehen. Ich möchte gerne ein Programm starten mit übergabe von Argumenten und Environment Variablen.

    Dazu habe ich folgendes versucht:

    #include <unistd.h>
    #include <stdio.h>
    
    void main()
    {
     char *argv[] = { "xterm", "-bg", "green", 0 };
     char *envp[] = { "PATH=/bin",  0 };
    
     execve(argv[0], &argv[0], envp);
    
     fprintf(stderr, "Oops!\n");
    }
    

    komischerweise liefer der systemcall mir einen fehler und die ausführung findet nicht statt. Weis jemand wieso?

    Wenn ich in der Shell:

    xterm -bg green PATH=/bin
    

    eingebe wird das anstandslos akzeptiert.

    Hab ich noch irgendwo etwas vielleicht vergessen?
    Danke für eure Hilfe

    Gruß Vertax



  • execve beachtet den PATH nicht, dafür brauchst du execvp:
    http://linux.die.net/man/3/execv

    Wenn du unbedingt via execve einen Custom-PATH übergeben möchtest, könntest du das zB. mit /bin/sh -c machen.

    edit: man.cx rendert die execvp-Manpage nicht.



  • Tipp: Benutz perror() um eine Fehlermeldung zu bekommen

    execve( ... );
    perror("execve");
    


  • Hi, danke erstmal für die Antworten, perror benutze ich in ner ErrorHandling function die ich immer nach nem excec aufrufe.
    Nur bin ich aus der Fehlermeldung nicht schlau geworden:

    Fehler bei execve: No such file or directory
    

    Was ich aber immer noch nicht verstehe:
    Bei excecve steht das v ja für vektor und e für environment.
    PATH ist aber doch eine environment variable, wieso funktioniert das dann nicht für xterm nicht, aber für /bin/sh -c env PATH=/bin jedoch schon?

    excecvp



  • Die neue Umgebung wird nur dem Prozess übergeben, aber nicht zum finden des Binaries benutzt. Das ist genau der Unterschied zwischen execve und execvpe.


Anmelden zum Antworten