2008-10-15 3 views
13

Я хотел бы точно знать, как работает команда «Is» в Linux и Unix.Как работает команда ls в Linux/Unix?

Насколько я знаю, ls forks & exec для оболочки linux/unix, а затем получает вывод (текущего дерева файлов, например,/home/ankit/). Мне нужно более подробное объяснение, так как я не уверен, что произойдет после вызова fork.

Может ли кто-нибудь объяснить функциональность команды «ls» в деталях?

ответ

38

ls не для вилки. Оболочки forks и execs для запуска любой команды, которая не встроена, и одна из команд, которые она может запускать, - ls.

ls использует opendir() и readdir() для просмотра всех файлов в каталоге. Если ему нужна дополнительная информация об одном из них, он вызывает stat().

+1

В качестве объекта интереса, я думаю, вы найдете его stat() примерно для каждого файла в каталоге, особенно если включены и добавлены цвета и/или тип файла pre/suffixs. – 2008-10-15 10:01:52

+0

С другой стороны, почему оболочке требуется fork для процессов переднего плана? – 2008-10-15 10:02:44

+2

monoxide: exec() без fork() заменит текущий процесс, что означает, что ваша оболочка исчезнет при первом запуске команды. – 2008-10-15 10:04:11

10

Чтобы добавить ответ, в книге языков программирования C (K & RC) они привели небольшой пример того, как реализовать реализацию ls. Они объяснили, что структуры данных и функции используются очень хорошо.

4

Чтобы понять, что делает ls, вы можете взять gander в источнике OpenSolaris: https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/cmd/ls/ls.c.

Если это потрясающе, на Solaris вы начинаете с использования фермы, чтобы посмотреть на системные вызовы, которые он делает, чтобы понять, что он делает. Используя бандаж, попробуйте:

стропильной -afl -o ls.out/бен/LS

затем посмотреть на выходе в ls.out

Я считаю, что след является эквивалентом Трасс в Linux.

3

Если вы действительно хотите понять подробную внутренность ls, посмотрите исходный код. Вы можете следить за ссылкой tpgould на источник Solaris, или легко найти источник в Интернете из любого дистрибутива Linux или BSD.

Я особенно рекомендую источник 4.4BSD.

Как я помню, ls начинается с разбора его многочисленных опций, затем начинается с файлов или каталогов, перечисленных в командной строке (по умолчанию «.»). Подкаталоги обрабатываются рекурсией в подпрограмму списка каталогов. На мой взгляд, нет fork() или exec().

0

Это старый поток, но все же я комментирую, потому что считаю, что ответ, который был одобрен и принят, частично неверен. @Mark говорит, что ls встроен в оболочку, поэтому оболочка не выполняет exec и fork. Когда я изучил документ tldp в bash (я прикрепил ссылку) «ls» не указан в команде сборки.

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

Bash Встроенные команды:

псевдоним, связать, встроенные, команда, объявить, эхо, включить помощь, пусть, местный, выход из системы, Printf, читать, shopt, тип, набранный , ulimit и unalias.

Смежные вопросы