Aufruf von 'ls' mit execv
Ich bin neu, um die Systemaufrufe und C-Programmierung und arbeite an meiner Universität Abtretung an.
Möchte ich nennen, die 'ls' - Befehl aus und drucken Sie das Verzeichnis.
Was ich habe: (ich habe Kommentare Hinzugefügt, damit Sie sehen können, was ich sehe, kommt durch jede variable.
int execute( command* cmd ){
char full_path[50];
find_fullP(full_path, p_cmd);
//find_fullP successfully updates full_path to /bin/ls
char* args[p_cmd->argc];
args[0] = p_cmd->name;
int i;
for(i = 1; i < p_cmd->argc; i++){
args[i] = p_cmd->argv[i];
}
/*
* this piece of code updates an args variable which holds arguments
* (stored in the struct) in case the command is something else that takes
* arguments. In this case, it will hold nothing since the command
* will be just 'ls'.
*/
int child_process_status;
pid_t child_pid;
pid_t pid;
child_pid = fork();
if ( child_pid == 0 ) {
execv( full_path, args );
perror("fork child process error condition!" );
}
pid = wait( &child_process_status );
return 0;
}
Ich bin nicht zu sehen, das etwas passiert und bin verwirrt, keine Ahnung?
Verwenden
Fügen Sie Protokollierung (nur drucken Zeug ist gut), um herauszufinden, wie weit man kommt und ob Variablen halten Sie die Werte, die Sie denken, dass Sie halten. Oder einen debugger verwenden.
Ihre
Wenn die Zuweisung zum drucken eines Verzeichnisses, würde ich erwarten, es zu bekommen bessere Noten.
Warum nicht ändern Sie die Darstellung von
opendir
, readdir
, und closedir
statt mit einem externen ProgrammFügen Sie Protokollierung (nur drucken Zeug ist gut), um herauszufinden, wie weit man kommt und ob Variablen halten Sie die Werte, die Sie denken, dass Sie halten. Oder einen debugger verwenden.
Ihre
args
array sollte kündigen mit NULL
. Sehen man execv
Wenn die Zuweisung zum drucken eines Verzeichnisses, würde ich erwarten, es zu bekommen bessere Noten.
Warum nicht ändern Sie die Darstellung von
p_cmd->argv[]
so dass p->cmd_argv[0]
ist der name des Programms? Dann müssen Sie nicht eine Kopie zu machen. Sie können einfach verwenden, dass argv
Objekt. Vergessen Sie nicht, dass argv[argc]
muss ein null-Zeiger. Die argv-für ein Programm mit N Argumenten erfordert N+2 Elemente. Eine für den Namen des Programms, N für die Argumente, und eine für den null-Zeiger beendet die Reihe. Wenn Sie nicht kündigen, das array, dann /bin/ls
finden Sie einen kompletten garbage-Zeiger in argv[1]
(so ls
stürzt ab), oder ein Zeiger auf junk-Daten (sieht aus wie eine Datei, die es nicht finden können).InformationsquelleAutor asdf | 2015-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist das minimale Programm, das ruft
ls
mitexecv
. Dinge zu beachtenargs
sollte die ausführbare Datei als ersten argargs
muss auf NULL endenargs
richtig eingestellt sind, dannargs[0]
können übergeben werden als Erster parameterexecv
InformationsquelleAutor user3386109