Если я скомпилирую программу с использованием gcc и попытаюсь выполнить ее из оболочки bash, какова точная последовательность шагов, выполняемых bash для ее выполнения?
Я знаю fork()
, execve()
, loader
, dynamic linker
(и другие вещи) участвует, но может кто - то дать точную последовательность шагов , и некоторые подходящие ссылки для чтения?
Редактировать:
Судя по ответам, вопрос может предполагать множество возможностей. Я хочу сузить до простого случая:
(test.c просто печатает привет мир)
$ gcc test.c -o test
$ ./test
Каковы будут действия в приведенном выше случае ( ./test
), конкретно относящиеся к программе запуска bash в каком-либо дочернем процессе, загрузке, компоновке и т. Д.?
shell
process
executable
Джейк
источник
источник
Ответы:
Ну, точная последовательность может отличаться, так как может быть псевдоним оболочки или функция, которая сначала раскрывается / интерпретируется перед выполнением фактической программы, а затем различия для определенного имени файла (
/usr/libexec/foo
) по сравнению с чем-то, что будет просматриваться во всех каталогах. изPATH
переменной окружения (толькоfoo
). Кроме того , детали исполнения могут осложнить ситуацию, посколькуfoo | bar | zot
требует больше работы для оболочки (некоторое количествоfork(2)
,dup(2)
и, конечно же ,pipe(2)
среди других системных вызовов), в то время как что - то вродеexec foo
гораздо меньше работы , как оболочка просто заменяет себя новая программа (то есть, это не такfork
). Также важны группы процессов (особенно группа процессов переднего плана, все PID которыхSIGINT
когда кто-то начинает затираться в Ctrl+ C, сессиях, и будет ли задание выполняться в фоновом режиме, monitored (foo &
) или background, ignored (foo & disown
). Детали перенаправления ввода / вывода также изменят ситуацию, например, если стандартный ввод закрывается shell (foo <&-
), или файл открывается как stdin (foo < blah
).strace
или подобное будет информативным о конкретных системных вызовах, выполняемых в ходе этого процесса, и для каждого из этих вызовов должны быть страницы руководства. Подходящим чтением на уровне системы будет любое количество глав из «Расширенного программирования в среде UNIX» Стивенса, в то время как книга оболочек (например, «От Bash до Z Shell») будет более подробно освещать аспекты оболочки.источник
Предполагая, что оболочка примера учебника (для ясности кода) уже запущена (так что динамический компоновщик сделан), команды, которые вы упомянули, потребуют, чтобы оболочка сделала следующие системные вызовы:
Более сложные команды, конечно, добавляют больше сложности к этой основной последовательности. Двумя более простыми примерами основных усложнений являются перенаправление базового ввода-вывода, когда между ветвью и exec и фоновыми процессами вставляется открывающая, закрывающая, дублирующая последовательность, где ожидание пропускается (и еще одно ожидание добавляется в обработчик sigchld).
источник
Я предлагаю прочитать Раздел 8.4.6 Использование fork и execve для запуска программ
на http://www.groupes.polymtl.ca/inf2610/documentation/ComputerSystemBook.pdf
источник