Kontrolliert zurück nach "execvp()"?
if(pid == 0)
{
execvp(cmd, args);
//printf("hello"); //apparently, putting this or not does not work.
_exit(-1);
}
else
{
//parent process work
}
"execvp()" ersetzt das aktuelle Programm mit den zu-sein-execed Programm (natürlich in der gleichen Prozess-Kontext). Also, setzen, sagen, alle printf () - Aufrufe nach execvp() funktioniert nicht. Das ist das, was die docs sagen, und ich habe überprüft, dass es als gut.
Aber dann, warum ist _exit() benötigt..? Tut es so passieren, dass die Kontrolle zurück zu Aussagen, post execvp() ?
Ich dankbar für jegliche Hinweise.
Dank
- Sie fehlt
pid = fork();
aus der vorhergehenden Zeile. Das ist ein bisschen wichtig! - Oder vielleicht
if ((pid = fork()) < 0) fatal("fork failed");
da es alles über fehlerhafte system-Aufrufe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Funktion zurückgibt, wenn Sie fehlgeschlagen ist.
Den
_exit()
ermöglicht beenden Sie den Prozess richtig und einen Exitcode zurückgeben, auch wenn exec ausfällt.Den
execve()
syscall scheitern kann. Der klassische Grund für diese Aktion sein würde, wenn die Datei nicht vorhanden oder nicht ausführbar.execvp()
umschlingtexecve()
hinzufügen Pfad suchen und die Standard-Umgebung Handhabung (praktisch immer, was Sie wollen!) und so fügt es in ein paar Fehlermöglichkeiten, insbesondere versuchen, etwas mit einem einfachen Namen, der nicht im Pfad des Benutzers. In jedem Fall, Fehler ist Fehler und es gibt nicht viel Sie tun können, wenn es geschieht, außer berichten, dass es schief gegangen ist, und Erhalten (jetzt nutzlos) - Kind-Prozess Aus Dodge. (Die einfachste Methode der Fehlerberichterstattung wird eine Fehlermeldung ausgegeben, vielleicht mitperror()
, aber es gibt andere.)Den Grund, warum Sie benötigen
_exit()
im Gegensatz zu dem normalenexit()
ist, weil Sie beenden möchten, wird der Kind-Prozess aber Sie nicht wollen, zu laufen alle registrierten cleanup-code im Zusammenhang mit der parent-Prozess. OK, eine Menge, es könnte harmlos sein, aber Dinge wie das schreiben auf Wiedersehen-Nachrichten an eine Buchse oder so etwas wäre schlecht, und es ist oft überhaupt nicht klar, was registriert wurde, mitatexit()
. Lassen Sie den parent-Prozess sorgen über die Ressourcen, die das Kind im Grunde besitzt nichts anderes als seine stack-frame!Wenn
execvp
ausfällt,_exit
aufgerufen werden.execvp
's man page sagt:Eine Sache zu beachten, die Sie in der Regel nicht möchten, dass ein Prozess exit-status unterzeichnet werden (wenn Portabilität Angelegenheiten). Während
exec()
ist frei, -1 im Fehlerfall zurück, seine Rückkehr, so dass Sie behandeln können, dass ein Versagen innerhalb der Kind-code.Den tatsächlichen
_exit()
status des Kindes sollte von 0 - 255, je nachdem, waserrno
erhoben wurde.