Лекция 1 - Среда исполнения. Среда исполнения введение
Скачать 155.5 Kb.
|
Среда исполнения процесса (продолжение)Информация о среде исполнения содержится в двух местах: в пользовательской области процесса и в стеке процесса. Как уже говорилось, параметры, хранящиеся в пользовательской области, напрямую не доступны пользовательскому коду, и некоторые из этих параметров процесс не может менять. В пользовательской области размещены: . Номер самого процесса и его родителя . Идентификатор группа процессов. Процесс входит в группу процессов. Группы используются при управлении заданиями, а также при отправке сигналов (можно отправить сигнал всем процессам группы) и при некоторых других операциях. . Ограничения процесса - максимально доступное время ЦП, максимальный размер сегмента данных, максимальный размер стека, максимальный размер создаваемого файла, максимальное число открытых файлов. . Идентификатор сессии. Группы процессов являются членами сессии. Сессия может иметь не более одного управляющего терминала. Определенные символы, посланные с управляющего терминала, вызывают посылку сигналов группам процессов соответствующей сессии. Управляющий терминал играет важную роль в обработке сигналов остановки и прерывания и в управлении заданиями. . Права доступа пользователя: реальный и эффективный идентификаторы пользователя, группы, роли. . Информацию о файловой системе. . Действия, совершаемые при получении сигнала. Пользовательский стек также содержит информацию об среде исполнения процесса. Размещенные в стеке параметры передаются процессу при системном вызове exec(2) и включают в себя: . Параметры командной строки (argc/argv) . Переменные среды (экспортированные переменные shell) И параметры командной строки, и переменные среды, представляют собой наборы строк, заканчивающихся символом '\0' (как и строковые литералы в языке C). Как получить доступ к среде исполненияВ программе на языке C можно получить прямой доступ только к той части среды исполнения, которая сохраняется в стеке. Доступ к аргументам командной строки можно осуществить через первые два параметра функции main: int argc и char ** argv. Параметр argc определяет количество аргументов, массив argv содержит указатели на них. Количество аргументов можно также определить по тому, что массив argv всегда заканчивается нулевым указателем. Штатных средств для изменения значений аргументов не предусмотрено. Для разбора аргументов командной строки доступна функция getopt(3C), которая описывается в приложении к этому разделу. При запуске программ из shell следует иметь в виду, что sесли один из аргументов команды содержит символы *, ? или [, shell интерпретирует такой аргумент как шаблон имени файла (точный формат шаблона описан на страницах руководства fnmatch(5) и sh(1)). Shell находит все файлы, соответствующие шаблону (если шаблон содержит также символы /, поиск может вестись в других каталогах; так, шаблон */* соответствует всем файлам во всех подкаталогах текущего каталога) и заменяет шаблон на список аргументов, каждый из которых соответствует одному из имён найденных файлов. Если файлов, соответствующих шаблону, не найдено, шаблон передаётся команде без изменений. Если вам нужно передать команде сам шаблон (например, команда find(1) или некоторые архиваторы ожидают шаблон имени файла, который следует найти), соответствующий аргумент необходимо экранировать одиночными или двойными кавычками, например find . -name '*.c' -print. Доступ к переменным среды можно получить через третий аргумент main, char ** envp, или через внешнюю переменную char ** envp, определенную в библиотеке libc. Общее количество переменных среды можно определить по тому, что массив envp также оканчивается нулевым указателем, как и argv. Каждая строка массива envp представляет собой описание одной переменной. Значение строки обязательно содержит символ =, например, TZ=Asia/Novosibirsk. Часть строки слева от = считается именем переменной (TZ в предыдущем примере), а справа — значением (Asia/Novosibirsk в предыдущем примере). Если = - последний символ в строке перед '\0', говорят, что переменная имеет пустое значение. Также для доступа к переменным среды можно пользоваться библиотечными функциями getenv(3C) и putenv(3C). Функция getenv(3C) возвращает значение переменной с указанным именем или нулевой указатель, если такой переменной нет. Функции putenv(3C) и setenv(3C) позволяют изменять переменные среды. Если переменная с указанным именем уже была, putenv и setenv заменяют ее значение; если такой переменной не было, они создают новую переменную. При добавлении новых переменных, putenv/setenv могут выделить новую память для размещения массива envp при помощи malloc(3C). При этом изменится значение переменной envp, но НЕ третьего параметра main. Рекомендуется обращаться к переменным среды при помощи getenv(3C), потому что на не Unix-системах список переменных среды может иметь другую структуру, и программа, анализирующая массив envp самостоятельно, потребует переделки. Кроме того, в многопоточной программе, вызов putenv(3C) в одном потоке параллельно со сканированием envp в другом потоке может привести к непредсказуемым результатам. Функции putenv(3C) и getenv(3C) в Solaris адаптированы к работе в многопоточной среде. Доступ и изменение остальной информация о среде исполнения может производиться только с помощью системных вызовов или библиотечных функций, содержащих системные вызовы. |