Ich habe einige Probleme mit Execve. Ich versuche, eine Shell zu erstellen, die genau wie die Bash-Shell funktionieren kann, aber ich habe Probleme mit dem gegabelten Kind, das einen Befehl ausführt. Hier ist, was ich für das Kind habe. cmd ist ein char * mit dem Befehl, dass der Benutzer eingegeben Allerdings, wenn ich dieses Programm ausführen, bekomme ich diesen Fehler aus perror.Execve - Keine solche Datei oder Verzeichnis?
execve error: No such file or directory.
ich das Programm mit einem einfachen ls versucht habe, und es sollte machen path = "/ bin/ls" und führe es aus (ich habe bestätigt, dass dies mein ls-Befehl ist), aber es beschwert sich immer noch. Was mache ich falsch? Vielen Dank!
Code:
if(pid == 0){
// Parse the command
char * word = strtok(cmd, " ");
char path[128] = "/bin/";
strcat(path, word);
// Execute the process
char * newenvp[] = { NULL };
char * newargv[] = { path, NULL };
ret = execve(path, newargv, newenvp);
if(ret == -1){
perror("execve error");
}
return EXIT_SUCCESS;
}
Haben Sie überprüft, dass 'Pfad' enthält, was Sie denken, dass es tut? Vor allem, weil 'strtok()' in seiner Funktionsweise etwas notorisch nervt und leicht Müll produzieren kann, wenn Sie nicht genau nach seinen Regeln spielen? – geekosaur
Nichts falsch, dass ich sehen kann. Warum werfen Sie nicht 'printf()' ein, um den endgültigen Inhalt von 'path' anzuzeigen, um sicherzustellen, dass' strtok' das Richtige tut - der 'execve'-Aufruf selbst sieht gut aus. –
Warum setzen Sie die Umgebung auf leer? Sie sollten wahrscheinlich plain 'execv()' verwenden, um Ihre aktuelle Umgebung zu verwenden, oder 'environ' als drittes Argument an 'execve()' übergeben. Ich bezweifle, dass dies die Ursache Ihres Problems ist, aber es ist eine bessere Übung. (Es ist auch oft sinnvoll, 'execv (newargv [0], newargv);' oder 'execve (newargv [0], newargv, environ) zu verwenden;'. Es hat keinen Sinn, den Rückgabestatus eines der 'exec *()' Funktionen: Wenn es zurückgegeben wird, ist es fehlgeschlagen; wenn es erfolgreich ist, wird es nicht zurückgegeben.) –