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 opendir, readdir, und closedir statt mit einem externen Programm
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 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

Schreibe einen Kommentar