Как работает команда ls в Linux/Unix?

Я хотел бы точно знать, как команда "Is" работает в Linux и Unix.

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

Можно ли подробно объяснить функциональность команды "ls"?

Ответы

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

alias, bind, builtin, command, declare, echo, enable, help, let, local, logout, printf, read, shopt, type, typeset, ulimit и unalias.