GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum erfordert „ls“ einen separaten Prozess zur Ausführung?

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.


Linux
  1. Warum funktioniert die Bash-Prozesssubstitution bei einigen Befehlen nicht?

  2. Warum verwendet niemand die True Bourne Shell als /bin/sh?

  3. Warum wird diese Shell-Pipeline beendet?

  4. Warum ruft popen() eine Shell auf, um einen Prozess auszuführen?

  5. Warum einen Linux-Shell-Befehl mit '&' ausführen?

Warum verwendet rsync keine Delta-Übertragung für lokale Dateien?

Warum funktioniert „dd“ nicht zum Erstellen eines bootfähigen USB-Sticks?

Warum fügt Strg + V nicht in Bash (Linux-Shell) ein?

Warum erfordert NTP einen bidirektionalen Firewall-Zugriff auf UDP-Port 123?

Warum ist SUID für Shell-Skripte deaktiviert, aber nicht für Binärdateien?

Warum benötigt der 'bin'-Benutzer eine Login-Shell?