2008-10-15 9 views
13

Ich würde gerne genau wissen, wie der "Is" Befehl in Linux und Unix funktioniert.Wie funktioniert der Befehl 'ls' in Linux/Unix?

Soweit ich weiß, ls Gabeln & exec auf die Linux/Unix-Shell und bekommt dann die Ausgabe (der aktuellen Dateibaum. Eg./home/ankit/). Ich brauche eine genauere Erklärung, da ich mir nicht sicher bin, was nach dem Aufruf von fork passiert.

Könnte jemand bitte die Funktionalität des 'ls'-Befehls im Detail erklären?

Antwort

38

ls verzweigt sich nicht. Die Shell forkiert und execs, um jeden Befehl auszuführen, der nicht eingebaut ist, und einer der Befehle, die ausgeführt werden können, ist ls.

ls verwendet opendir() und readdir(), um durch alle Dateien im Verzeichnis zu gehen. Wenn es mehr Informationen über eines von ihnen benötigt, ruft es stat() auf.

+1

Als einen Punkt von Interesse, ich denke, Sie finden es stat() ist fast jede Datei in dem Verzeichnis, vor allem, wenn Farben und/oder Dateityp Pre/Suffixe eingeschaltet sind. –

+0

Eine andere Anmerkung, warum muss die Shell für Vordergrundprozesse verzweigen? –

+2

Monoxid: Ein exec() ohne fork() ersetzt den gerade laufenden Prozess, was bedeutet, dass Ihre Shell beim ersten Ausführen eines Befehls verschwinden würde. –

10

auf die Antwort, in der Programmiersprache C Buch (K & RC) sie ein kleines Beispiel dafür, wie über die Implementierung von ls gehen hinzuzufügen gegeben haben. Sie haben die verwendeten Datenstrukturen und Funktionen sehr gut erklärt.

+1

Wenn hier jemand kommt, ist der Abschnitt "8.6" im Buch. – avi

4

Um zu verstehen, was ls tut, könnten Sie einen Blick auf die OpenSolaris-Quelle werfen: https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/cmd/ls/ls.c.

Wenn das überwältigend ist, beginnen Sie bei Solaris mit Truss, um sich die Systemaufrufe anzuschauen, die ls verstehen lassen, was es macht. Mit Truss, versuchen:

Truss -afl -o ls.out/bin/ls

dann am Ausgang suchen in ls.out

glaube ich, dass Spur ist das Äquivalent in Linux binder.

+3

Die Linux-Version von "Truss" heißt "strace". – Thomas

3

Wenn Sie die detaillierten Innereien von ls wirklich verstehen wollen, sehen Sie sich den Quellcode an. Sie können dem Link von tpgould zur Solaris-Quelle folgen, oder es ist einfach, die Quelle online von einer beliebigen Linux- oder BSD-Distribution aus zu finden.

Ich empfehle besonders die 4.4BSD-Quelle.

Wie ich mich erinnere, beginnt ls mit dem Parsen seiner vielen Optionen und beginnt dann mit den Dateien oder Verzeichnissen, die in der Befehlszeile aufgeführt sind (Standard ist "."). Unterverzeichnisse werden durch Rekursion in die Verzeichnislistenroutine behandelt. Es gibt keine fork() oder exec(), an die ich mich erinnere.

+0

Kompletter C-Neuling, der eines Morgens aufgewacht ist und sich gefragt hat, wie C funktioniert. Ist das die 4.4BSD-Datei in Frage? (Offensichtlich wird es eine Weile dauern, bis ich in der Lage bin, es zu verstehen, aber ich muss irgendwo anfangen ...) https://github.com/sergev/4.4BSD-Lite2/blob/master/usr/ src/bin/ls/ls.c – henry

+0

@henry Das ist die Datei, obwohl sie (oder jede andere ls.c) wahrscheinlich zu komplex für einen "kompletten C-Neuling" ist, der sie zum Lernen benutzt. – mpez0

+0

Ja, ich werde das sicher nicht so bald verstehen, aber zumindest kenne ich das Ziel. Vielen Dank! – henry

0

Dies ist ein alter Thread, aber immer noch ich kommentieren, weil ich glaube, dass die Antwort, die upvoted und akzeptiert wurde, teilweise falsch ist. @Mark sagt, dass ls in die Shell eingebaut ist, so dass die Shell nicht exec und fork ist. Als ich das tldp-Dokument auf bash studierte (ich habe den Link beigefügt) "ls" ist nicht als ein Build-Befehl aufgeführt.

http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_01_03.html

Bash gebautet Befehle:

alias, bind, builtin, Befehl, erklären, Echo, ermöglichen, helfen lassen, lokal, Logout, printf, lesen, shopt, Typ, typeset , ulimit und unalias.

+3

Ich glaube, du verstehst die ursprüngliche Antwort falsch und in hitziger Übereinstimmung damit. Die Frage lautete "ls forks & exec an die Linux/Unix-Shell", auf die die Antwort richtig antwortete "ls gabel nicht. Die Shell gabelt und execs" und fuhr fort zu sagen, dass ls ist einer der Befehle der Shell-Gabeln/execs. – alanc

+1

@alanc Danke für die Klarstellung. Up abstimmen die angenommene Antwort :) – Raghupathy

Verwandte Themen