2016-09-24 4 views
0

printf (* arg); execvp (* arg, arg);
Hier printf() -Anweisung druckt Wert = ls.But beim Ausführen von Programm Execvp gibt es keine solche Datei oder Verzeichnis. else if (pid == 0) {Erstellen einer einfachen Unix-Shell mit fork, execvp

printf(*arg); 
    execvp(*arg, arg); 

    char* error = strerror(errno); 
    printf("shell: %s: %s\n", arg[0], error); 
    return 0; 
    if(execvp(arg[0], arg)<0) 
    { 
    printf("***ERROR: execution failedn\n"); 
    } 
    return 0; 
} 
+1

Können Sie uns die Ausgabe des zweiten Ausdrucks zeigen, wo Sie 'arg [0]' drucken? Ein häufiger Fehler beim Schreiben einer Shell besteht darin, zu vergessen, das Zeilenumbruchzeichen vom Ende der vom Benutzer gelesenen Eingabezeile zu schneiden. –

Antwort

0

Im folgenden Code sind zwei Beispiele dafür, wie execvp zu verwenden.

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(int argc, char **argv) { 
    char *args[] = {"ls", "-l", NULL}; 

    /* an example with a decleared array containing the commande */ 
    if (fork() == 0) { 
     execvp(args[0], args); 
    } 

    /* another example where the commande was passed to main */ 
    printf("argv[0] is the programme/executable name!\nargv[0] = %s\n", argv[0]); 
    if (fork() == 0) { 
     execvp(argv[1], argv + 1); 
    } 

    return EXIT_SUCCESS; 
} 

Die execv(), execvp() und execvpe() Funktionen bieten eine Reihe von Zeiger auf nullterminierten Strings, die die Argumentliste verfügbar auf das neue Programm darstellen.

Das erste Argument, per Konvention, sollte auf den Dateinamen mit der Datei ausgeführt werden, die ausgeführt wird. Das Array von Zeigern muss mit einem Nullzeiger beendet werden.

Verwandte Themen