Parameterübergabe an execve



  • Hallo, ich möchte iterativ an execve zwei Parameter übergeben. Ein Buchstabe, der erhöht wird. A, B, C usw. Der zweite Parameter "1" ist konstant. Dazu folgender String:

    char *argumente[] = {"A","1"};
    

    Den Buchstaben möchte ich so in einer Schleife erhöhen:

    argumente[0][0] = argumente[0][1]+1;  //Ascii 65 + 1
    

    . Der Programmaufruf sieht so aus:

    execvp("Programmname",argumente);
    

    Das Programm stürtzt bei der Erhöhung ab. Der Kompiler meldet keine Fehler. Hat jemand vieleicht eine Idee..?
    Mathias



  • An welchem der Argumente, die Du execve übergibst, soll execve erkennen können, wieviele Argumente übergeben wurden? Richtig, es gibt keins. Du musst execve mitteilen, wann die Liste zuende ist. In der Manualpage steht dazu, dass die Liste mit NULL terminiert werden muss.



  • Um LordJaxoms Antwort zu ergänzen:

    char *argumente[] = {"Programname", "A", "1", NULL};
    

    🙂

    Nachtrag:
    es ist Konvention, dass das erste Parameter (argv[0]) stets den Pfad des aufrufenden Programms (bzw. des Strings, wie das Programm ausgeführt wurde) enthält. Siehe folgendes Beispiele.

    /* test.c */
    #include <stdio.h>
    
    int main(int argc, char **argv)
    {
        int i; 
        for(i=0; i < argc; ++i)
            printf("argv[%d] = %s\n", i, argv[i]);
    
        return 0; 
    }
    
    /* exec.c */
    #include <unistd.h>
    
    #define EXE "/home/yanez/tmp/exec/test"
    
    #define BASE_PARAMS "Hallo", "Pablo", "was", "gibt", "Alter?", NULL
    
    #ifdef WITH_PATH
      #define PARAMS EXE, BASE_PARAMS
    #else
      #define PARAMS BASE_PARAMS
    #endif
    
    int main(void)
    {
        char *args[] = {PARAMS};
    
        //return execlp(EXE, PARAMS);
        return execvp(EXE, args);
    }
    

    So, wenn man sich an der Konvention hält:

    $ gcc exec.c -oexec -DWITH_PATH && ./exec
    argv[0] = /home/yanez/tmp/exec/test
    argv[1] = Hallo
    argv[2] = Pablo
    argv[3] = was
    argv[4] = gibt
    argv[5] = Alter?
    

    Wenn man sich nicht an der Konvention hält:

    $ gcc exec.c -oexec && ./exec
    argv[0] = Hallo
    argv[1] = Pablo
    argv[2] = was
    argv[3] = gibt's
    argv[4] = Alter?
    


  • Danke. Das wars. Der erste Parameter ist wohl das Verzeichniss.



  • mathias_8001 schrieb:

    Danke. Das wars. Der erste Parameter ist wohl das Verzeichniss.

    es muss nicht das Verzeichnis sein, sondern der ganze Pfad oder das String, wie es aufgerufen wurde, z.b. wenn man ../../program aufruft, dann muss das erste Parameter ../../program sein, bei /bin/ls -alh ist auch das erste Parameter /bin/ls und nicht /bin .


Anmelden zum Antworten