Тупой вопрос: всегда ли пользовательские программы открываются в оболочке? - PullRequest
0 голосов
/ 26 октября 2019

Пользовательские программы имеют общую среду, которая зависит от ОС (например, дескрипторы файлов 0, 1, 2 (stdin, stdout, stderr)). Я слышал, что программа наследует среду оболочки, но я всегда думал о оболочке как о интерактивной оболочке (например, оболочка bash). Я знаю, что процессы можно запускать в фоновом режиме, и я ожидаю, что они наследуют среду оболочки, но как насчет других процессов, которые запускаются с помощью средства запуска или ярлыка на рабочем столе, или даже тех, которые автоматически запускаются ОС? Другими словами, относится ли «оболочка» к среде выполнения, предоставляемой ОС?

1 Ответ

1 голос
/ 26 октября 2019

Детали ответа зависят от конкретной операционной системы и оболочки, о которой вы говорите.

Пользовательские программы используют общую среду, которая зависит от ОС (например, файловые дескрипторы 0, 1, 2 (стандартный, стандартный, стандартный)).

Это не совсем правильно. Например, в Linux:

  • Переменные среды не являются общими. Переменные копируются из родительского объекта в дочерний, когда он создается, и затем они не зависят от. Это, когда вы изменяете переменную окружения в потомке, родитель не видит его. И наоборот.

  • Файловые дескрипторы не являются общими. Некоторые файловые дескрипторы клонируются в дочернем процессе, поэтому они ссылаются на один и тот же источник или место назначения для байтов. Однако файловые дескрипторы функционируют независимо. Например, если родительский и дочерний элементы имеют stdin, указывающие на один и тот же входной файл, когда родительский элемент выполняет seek, это не влияет на дочерний элемент или наоборот.

Другими словами, относится ли «оболочка» к среде выполнения, предоставляемой ОС?

Что происходит (в Linux / UNIX / OSX), что оболочка 1 выполняет fork и exec для создания дочернего процесса, выполняющего команду, запрошенную пользователем. Системный вызов fork создает дочерний процесс, который является клоном родительского процесса (оболочки). Дочерний процесс выполняет некоторую настройку, а затем вызывает exec, чтобы начать выполнение пользовательской команды.

Перед выполнением дочерний процесс устанавливает файловые дескрипторы, которые команда будет использовать;например, стандартный ввод, стандартный вывод и стандартный вывод. Аргументы команды и копия переменных среды оболочки передаются через границу exec через параметры syscall.

Однако это также может быть сделано прикладной программой без помощи оболочки .

Итак, ответ на ваш вопрос - нет.

Обратите внимание, что оболочка является программой, а не частью ядра операционной системы. Действительно, нет ничего особенного (то есть привилегированного) в программе оболочки. Вы можете написать один самостоятельно, если хотите.

... но как насчет других процессов, которые запускаются с помощью средства запуска или ярлыка на рабочем столе, или даже тех, которые автоматически запускаются ОС?

Это зависит. Они часто используют оболочку, потому что процесс запуска часто включает в себя анализ интерпретирующих перенаправлений оболочки, расширений переменных среды и так далее. Но они не обязательно должны.


1 - Исключением является случай, когда вы exec some-command ... из оболочки. В этом случае оболочка не fork дочерний процесс. Вместо этого он просто использует системный вызов exec для замены исполняемого файла оболочки на исполняемый файл запрошенной программы.

...