Я хотел бы точно знать, как команда «Is» работает в Linux и Unix.
Насколько мне известно, ls разветвляет & exec в оболочку Linux / Unix, а затем получает вывод (текущего дерева файлов. Например, /home/ankit/). Мне нужно более подробное объяснение, так как я не уверен в том, что происходит после вызова fork.
Может ли кто-нибудь подробно объяснить функциональность команды ls?





ls не разветвляется. Оболочка разветвляется и запускается, чтобы запустить любую команду, которая не встроена, и одна из команд, которые она может выполнить, - это ls.
ls использует opendir () и readdir () для просмотра всех файлов в каталоге. Если ему нужна дополнительная информация об одном из них, он вызывает stat ().
С другой стороны, почему оболочке нужно выполнять форк для процессов переднего плана?
monoxide: exec () без fork () заменит текущий запущенный процесс, что означает, что ваша оболочка исчезнет при первом запуске команды.
Спасибо, Марк, вот часть замедления от K&RC, чтобы помочь другим. DIR * opendir (char * dirname); Dirent * readdir (DIR * dfd); void closedir (DIR * dfd);
если ls является встроенным, как в некоторых автономных оболочках, он по-прежнему выполняет fork и exec?
Если он встроен, ему не нужно запускать другую программу, поэтому exec () не требуется. Независимо от того, является ли это fork () s или нет, зависит от оболочки и ситуации - например, если бы cat был встроен, все равно было бы легче выполнить fork для обработки чего-то вроде cat | cat, но разветвленный read сложен.
@Mark: он также использует lstat (), поскольку в противном случае он видит только разрешения файла в дальнем конце символической ссылки, а не саму символическую ссылку.
@monoxide: оболочка может запускать другие программы ровно одним из двух способов - используя exec () для замены себя другой программой или используя fork (), а затем exec (). Это единственные механизмы, доступные в Unix (если не считать pthread_spawn ()).
jonathan, библиотека pthread основана на системном вызове clone () (в linux - другие версии unix с потоковой передачей ядра будут иметь что-то похожее, но, вероятно, не идентичное). Использование clone () напрямую, а затем exec () - еще один способ запуска программы, хотя и не полезный на практике.
Чтобы добавить к ответу, в книге «Язык программирования C» (K&R C) они привели небольшой пример того, как приступить к реализации ls. Они очень хорошо объяснили используемые структуры данных и функции.
Если кто-нибудь сюда придет, то в книге есть раздел 8.6.
Чтобы понять, что делает ls, вы можете взглянуть на исходный код OpenSolaris: https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/cmd/ls/ls.c.
Если это сложно, то в Solaris вы начинаете с использования truss, чтобы посмотреть на системные вызовы, которые делает ls, чтобы понять, что он делает. Используя ферму, попробуйте:
ферма -afl -o ls.out / bin / ls
затем посмотрите на вывод в ls.out
Я считаю, что trace эквивалентен truss в Linux.
Версия truss для Linux называется strace.
Если вы действительно хотите разобраться в деталях изнутри ls, посмотрите исходный код. Вы можете перейти по ссылке tpgould на исходный код Solaris, или его легко найти в Интернете в любом дистрибутиве Linux или BSD.
Я особенно рекомендую исходный код 4.4BSD.
Насколько я помню, ls начинает с анализа множества его параметров, а затем начинает с файлов или каталогов, перечисленных в командной строке (по умолчанию "."). Подкаталоги обрабатываются рекурсией в подпрограмму списка каталогов. Насколько я помню, нет ни fork (), ни exec ().
Новичок в прохождении C, который однажды утром проснулся, задаваясь вопросом, как работает C. Это файл 4.4BSD, о котором идет речь? (Очевидно, пройдет некоторое время, прежде чем я смогу разобраться в этом, но нужно с чего-то начать…) github.com/sergev/4.4BSD-Lite2/blob/master/usr/src/bin/ls/ls .c
@henry Это файл, хотя он (или любой другой ls.c), вероятно, слишком сложен для "полного новичка в C", использующего его для изучения.
Да определенно не пойму этого в ближайшее время, но, по крайней мере, я знаю цель. Спасибо!
Это старая ветка, но я все же комментирую, потому что считаю, что ответ, который был одобрен и принят, частично неверен. @Mark говорит, что ls встроен в оболочку, поэтому оболочка не запускается и не разветвляется. Когда я изучал 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.
Я думаю, вы неправильно понимаете исходный ответ и полностью с ним согласны. В вопросе говорилось, что «ls разветвляет и выполняет оболочку linux / unix», на что в ответе правильно ответили «ls не разветвляется. Оболочка разветвляет и выполняет» и далее говорится, что ls - это одна из команд, которые оболочка разветвляет / руководители.
@alanc Спасибо за разъяснения. Проголосовал за принятый ответ :)
Что интересно, я думаю, вы обнаружите, что stat () относится практически к каждому файлу в каталоге, особенно если включены цвета и / или пре / суффиксы для типов файлов.