Warum funktioniert ls
erfordern einen separaten Prozess für seine Ausführung?
Ich kenne den Grund, warum Befehle wie cd
kann nicht durch den Forking-Mechanismus ausgeführt werden, aber schadet es, wenn ls
wird ohne Verzweigung ausgeführt?
Akzeptierte Antwort:
Die Antwort ist mehr oder weniger das ls
ist eine externe ausführbare Datei. Sie können seinen Standort sehen, indem Sie type -p ls
ausführen .
Warum ist nicht ls
in die Schale eingebaut? Nun, warum sollte es sein? Die Aufgabe einer Shell besteht nicht darin, alle verfügbaren Befehle zu umfassen, sondern eine Umgebung bereitzustellen, in der sie ausgeführt werden können. Einige moderne Shells haben echo
, printf
, und ihresgleichen als Builtins, die technisch nicht müssen eingebaut werden, werden aber aus Leistungsgründen so gemacht, wenn sie wiederholt ausgeführt werden (hauptsächlich in engen Schleifen). Ohne sie eingebaut zu machen, müsste die Shell für jeden Aufruf einen neuen Prozess forken und ausführen, was extrem langsam sein könnte.
Zumindest das Ausführen von ls
, eine externe ausführbare Datei, erfordert die Ausführung eines Systemaufrufs aus der exec-Familie. Sie könnten Tun Sie dies ohne Forking, aber es würde die primäre Shell ersetzen, die Sie verwenden. Sie können sehen, was in diesem Fall passiert, indem Sie Folgendes tun:
exec ls; echo "this never gets printed"
Da das Prozessabbild Ihrer Shell ersetzt wird, ist die aktuelle Shell danach nicht mehr erreichbar. Damit die Shell nach dem Ausführen von ls weiterlaufen kann, müsste der Befehl in die Shell eingebaut werden.
Forking ermöglicht das Ersetzen eines Prozesses, der nicht Ihre primäre Shell ist, was bedeutet, dass Sie Ihre Shell danach weiter ausführen können.