POSIX против действительности — КиберПедия 

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

POSIX против действительности

2021-01-29 56
POSIX против действительности 0.00 из 5.00 0 оценок
Заказать работу

 

Диапазон значений относительного приоритета от ‑20 до 19, которые использует Linux, имеет исторические корни; он ведет начало по крайней мерее V7. POSIX выражает состояние менее прямым языком, что дает возможность большей гибкости, сохраняя в то же время историческую совместимость. Это также затрудняет чтение и понимание стандарта, вот почему вы и читаете эту книгу. Итак, вот как описывает это POSIX

Во‑первых, значение относительного приоритета процесса, поддерживаемое системой, колеблется от 0 до ''. Константа определена в и должна равняться по крайней мере 20. Это дает диапазон 0–39.

Во‑вторых, как мы описывали, сумма текущего значения относительного приоритета и приращение загоняются в этот диапазон.

В заключение, возвращаемое значение является значением относительного приоритета процесса минус. При значении 20 это дает первоначальный диапазон от ‑20 до 19, который мы описали вначале.

Результатом является то, что возвращаемое nice() значение в действительности изменяется от '' до '', и лучше всего писать свой код в терминах этой именованной константы. Однако, на практике трудно найти систему, в которой не было бы равно 20.

 

 

Запуск новой программы: семейство

 

После запуска нового процесса (посредством) следующим шагом является запуск в процессе другой программы. Имеется несколько функций, которые служат различным целям:

 

Мы ссылаемся на эти функции как на «семейство». Функции с именем нет; вместо этого мы используем это имя для обозначения любой из перечисленных выше функций. Как и в случае с, «» используется на языке Unix и в качестве глагола, означающего исполнение (запуск) программы, и в качестве существительного.

 

Системный вызов

 

Простейшей для объяснения функцией является. Она является также лежащим в основе системным вызовом. Другие являются функциями‑оболочками, как вскоре будет объяснено.

 

 

 является именем программы для исполнения. Это может быть именем полного или относительного пути. Файл должен иметь формат исполняемого файла, который понимает ядро. Современные системы используют формат исполняемого файла ELF (Extensible Linking Format – открытый формат компоновки). GNU/Linux распознает ELF и несколько других форматов. С помощью можно исполнять интерпретируемые сценарии, если они используют особую первую строку с именем интерпретатора, начинающуюся с ''. (Сценарии, которые не начинаются с '', потерпят неудачу.) В разделе 1.1.3 «Исполняемые файлы» представлен пример использования '#!'. argv является стандартным списком аргументов С – массив символьных указателей на строки аргументов, включая значение для использования с [90], завершающийся указателем.

 является окружением для использования новым процессом, с таким же форматом, как глобальная переменная (см. раздел 2.4 «Переменные окружения»). В новой программе это окружение становится начальным значением.

Программа не должна возвращаться из вызова. Если она возвращается, возникла проблема. Чаще всего либо не существует затребованная программа, либо она существует, но не является исполняемой (значения для и соответственно). Может быть множество других ошибок; см. справочную страницу execve (2).

В предположении, что вызов был успешным, текущее содержимое адресного пространства процесса сбрасывается. (Ядро сначала сохраняет в безопасном месте данные и.) Ядро загружает для новой программы исполняемый код вместе со всеми глобальными и статическими переменными. Затем ядро инициализирует переменные окружения переданными данными, а далее вызывает процедуру новой программы с переданным функции массивом. Подсчитывается число аргументов и это значение передается в.

К этому моменту новая программа запущена. Она не знает (и не может определить), какая программа была в процессе до нее. Обратите внимание, что ID процесса не меняется. Многие другие атрибуты при вызове сохраняются; вскоре мы рассмотрим это более подробно.

 для процесса можно сравнить с ролями, которые играют в жизни люди. В различное время в течение дня один человек может быть родителем, супругом, другом, студентом или рабочим, покупателем в магазине и т.д. Это одна и та же личность, исполняющая различные роли. Также и процесс – его PID, открытые файлы, текущий каталог и т.п. – не изменяются, тогда как выполняемая работа ‑ запущенная с помощью программа – может измениться.

 

9.1.4.2. Функции‑оболочки: и др.

 

Пять дополнительных функций, действующих в качестве оболочек, предоставляют более удобные интерфейсы для. В первой группе все принимают список аргументов, каждый из которых передается в виде явного параметра функции:

 

Первый аргумент,, является путем к исполняемому файлу. Последующие аргументы, начиная с, являются отдельными элементами, которые должны быть помещены в. Как и ранее, явным образом должен быть включен. Вы должны в качестве последнего аргумента передать завершающий указатель, чтобы смогла определить, где заканчивается список аргументов. Новая программа наследует любые переменные окружения, которые находятся в переменной.

 

Эта функция подобна, но она имитирует механизм поиска команд оболочки, разыскивая в каждом каталоге, указанном в переменной окружения. Если содержит символ, этот поиск не осуществляется. Если в окружении не присутствует, использует путь по умолчанию. В GNU/Linux по умолчанию используется "", но в других системах может быть другое значение. (Обратите внимание, что ведущее двоеточие в означает, что сначала поиск осуществляется в текущем каталоге.)

Более того, если файл найден и имеет право доступа на исполнение, но не может быть исполнен из‑за того, что неизвестен его формат, считает, что это сценарий оболочки и запускает оболочку с именем файла в качестве аргумента.

 

 

Эта функция также подобна, но принимает дополнительный аргумент,, который становится окружением новой программы. Как и в случае с, вы должны для завершения списка аргументов поместить перед указатель.

Вторая группа функций‑оболочек принимает массив в стиле:

 

Эта функция подобна, но новая программа наследует любое окружение, которое находится в переменной environ текущей программы.

 

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

В табл. 9.1 подведены итоги для шести функций.

 

Таблица 9.1. Сводка семейства функций по алфавиту

 

 Функция Поиск пути Окружение пользователя Назначение
    Исполняет список аргументов.
      Исполняет список аргументов с окружением.
  Исполняет список аргументов с поиском пути
    Исполняет с
      Исполняет с и окружением (системный вызов).
  Исполняет с и с поиском пути

Функций и лучше избегать, если вы не знаете, что переменная окружения содержит приемлемый список каталогов.

 

Имена программ и

 

До сих пор мы все время считали именем программы. Мы знаем, что оно может содержать, а может и не содержать символ, в зависимости от способа вызова программы, если этот символ содержится, это хорошая подсказка к тому, что для вызова программы использовалось имя пути.

Однако, как должно быть ясно к этому времени, то, что содержит имя файла, является лишь соглашением. Ничто не может воспрепятствовать передаче вами вызываемой программе в качестве произвольной строки. Следующая программа,, демонстрирует передачу произвольной строки:

 

Первый аргумент является путем к запускаемой программе, а второй аргумент является новым именем для программы (которое большинство утилит игнорируют, кроме сообщений об ошибках); все остальные аргументы передаются вызываемой программе.

Строки 13–16 осуществляют проверку ошибок. Строка 18 сохраняет путь в Строка 20 осуществляет; если программа доходит до строк 22–23, это указывает на ошибку. Вот что происходит при запуске программы:

ch09‑run /bin/grep whoami foo

A line

A line with foo in it

A line with foo in it

^D

ch09‑run nonexistent‑program foo bar

 

Следующий пример несколько неестественен: мы заставили запустить себя, передав в качестве имени программы ''. Поскольку аргументов для второго запуска недостаточно, она выводит сообщение об использовании и завершается:

ch09‑run./ch09‑run foo

 

Хотя она и не очень полезна, ясно показывает, что не обязательно должен иметь какое‑нибудь отношение к файлу, который в действительности запускается.

В System III (примерно в 1980‑м) команды, и представляли один исполняемый файл с тремя ссылками с этими именами в. Программа проверяла и решала, что она должна делать. Это сохраняло некоторое количество дискового пространства за счет усложнения исходного кода и форсирования выполнения программой действия по умолчанию при запуске с неизвестным именем. (Некоторые современные коммерческие системы Unix продолжают эту практику!) Без явной формулировки причин GNU Coding Standards рекомендует, чтобы программы не основывали свое поведение на своем имени. Одна причина, которую мы видели, состоит в том, что администраторы часто устанавливают GNU версию утилиты наряду со стандартной версией коммерческих систем Unix, используя префикс g:, и т.д. Если такие программы ожидают лишь стандартные имена, они при запуске с другим именем потерпят неудачу.

Сегодня также дисковое пространство дешево; если из одного и того же исходного кода можно построить две почти идентичные программы, лучше это сделать, использовав, что у вас есть. Например, и имеют значительную часть общего кода, но GNU версия строит два отдельных исполняемых файла.

 

Атрибуты, наследуемые

 

Как и в случае с, после вызова программой сохраняется ряд атрибутов:

• Все открытые файлы и открытые каталоги; см. раздел 4.4.1 «Понятие о дескрипторах файлов» и раздел 3.3.1 «Базовое чтение каталогов». (Сюда не входят файлы, помеченные для закрытия при исполнении (close‑on‑exec), как описано далее в этой главе; см. раздел 9.4.3.1 «Флаг close‑on‑exec».)

• Установки umask; см. раздел 4.6 «Создание файлов».

• Текущий рабочий каталог, см. раздел 8.4.1 «Изменение каталога: и»

• Корневой каталог; см. раздел 8.6 «Изменение корневого каталога:».

• Текущее значение относительного приоритета.

• ID процесса и ID родительского процесса.

• ID группы процесса и контролирующий терминал; см. раздел 9.2.1 «Обзор управления работами».

• Маску сигналов процесса и любые ожидающие сигналы, а также любые не истекшие аварийные сигналы или таймеры (здесь не обсуждается; см. главу 10 «Сигналы»).

• Действительные ID пользователя и ID группы, а также дополнительный набор групп. Эффективные ID пользователя и группы (а следовательно, и сохраненные ID set‑user и set‑group) могут быть установлены с помощью битов setuid и setgid исполняемого файла. (Ничто из этого пока не обсуждалось; см. главу 11 «Права доступа и ID пользователя и группы».)

• Блокировки файлов сохраняются (также пока не обсуждалось; см. раздел 14.2 «Блокировка файлов»).

• Суммарное использованное время процессора для процесса и его потомков не меняется.

После размещение сигналов изменяется; дополнительные сведения см. в разделе 10.9 «Сигналы для и».

После все открытые файлы и каталоги остаются открытыми и доступными для использования. Вот как программы наследуют стандартные ввод, вывод и ошибку: они на месте, когда программа запускается.

В большинстве случаев при исполнении и для отдельной программы не нужно ничего наследовать, кроме дескрипторов файлов 0, 1 и 2. В этом случае можно вручную закрыть все другие открытые файлы в порожденном процессе после выполнения и до выполнения. В качестве альтернативы можно пометить дескриптор файла для автоматического закрытия системой при исполнении exec; эта последняя возможность обсуждается далее в главе (см раздел 9.4.3.1 «Флаг close‑on‑exec».)

 

 

Завершение процесса

 

Завершение процесса включает два шага: окончание процесса с передачей системе статуса завершения и восстановление информации родительским процессом.

 


Поделиться с друзьями:

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.04 с.