А. Робачевский - Операционная система UNIX (1114671), страница 34
Текст из файла (страница 34)
Если этот процесс непринадлежит к тому же сеансу, что и процесс, сделавший системный вы!зов, функция возвращает ошибку.Системный вызов setpgid(2) позволяет процессу стать членом существую!щей группы или создать новую группу.ttinclude <unistd.h>intpid,pid_tФункция устанавливает идентификатор группы процесса pid равнымpgid. Процесс имеет возможность установить идентификатор группы длясебя и для своих потомков (дочерних процессов).
Однако процесс не мо!жет изменить идентификатор группы для дочернего процесса, которыйвыполнил системный вызов ехес(2), запускающий на выполнение другуюпрограмму.Если значения обоих аргументов равны, то создается новая группа с иден!тификатором pgid, а процесс становится лидером (group leader) этой груп!пы. Поскольку именно таким образом создаются новые группы, их иден!тификаторы гарантированно уникальны. Заметим, что группа не удаляетсяпри завершении ее лидера, пока в нее входит хотя бы один процесс.Идентификатор сеанса можно узнать с помощью функцииttinclude#includepid_t g e t s i d ( p i d _ tКак и в случае с группой, идентификатор pid должен адресовать процесс,являющийся членом того же сеанса, что и процесс, вызвавший getsid(2).Заметим, что эти ограничения не распространяются на процессы, имею!щие привилегии суперпользователя.Вызов функцииприводит к созданию нового сеанса:#includepid_tНовый сеанс создается лишь при условии, что процесс не является лиде!ром какого!либо сеанса.
В случае успеха процесс становится лидером се!анса и лидером новой группы.Понятия группы и сеанса тесно связаны с терминалом или, точнее, сдрайвером терминала. Каждый сеанс может иметь один ассоциированныйтерминал, который называется управляющим терминалом (controllingterminal), а группы, созданные в данном сеансе, наследуют этот управ!www.books-shop.comПроцессытерминал. Наличие управляющего терминала позволяет ядру кон!тролировать стандартный ввод/вывод процессов, а также дает возможностьотправить сигнал всем процессам ассоциированной с терминалом группы,например, при его отключении.
Типичным примером является регистрацияи работа пользователя в системе. При входе в систему терминал пользовате!ля становится управляющим для лидера сеанса (в данном случае для ко!мандного интерпретатора shell) и всех процессов, порожденных лидером(в данном случае для всех процессов, которые запускает пользователь из ко!мандной строки интерпретатора). При выходе пользователя из системы shellзавершает свою работу и таким образом отключается от управляющего тер!минала, что вызывает отправление сигнала SIGHUP всем незавершеннымпроцессам текущей группы. Это гарантирует, что после завершения работыпользователя в системе не останется запущенных имТекущие и фоновые группы процессовКак было показано, для каждого управляющего терминала существует се!анс, включающий одну или несколько групп процессов.
Одна из этихгрупп является текущей (foregroud group), а остальные фоновыми(backgroundСигналы SIGINT и SIGQUIT, которые генерируютсядрайвером терминала, посылаются всем процессам текущей группы. По!пытка процессов фоновых групп осуществить доступ к управляющемутерминалу, как правило, вызывает отправление им сигналов SIGSTP,SIGTTIN ИЛИРассмотрим следующие команды:$ find / name$ cat | sort&При этом происходит чтение ввода пользователя с клавиатурыисортировка введенных данныхЕсли интерпретатор поддерживаетуправление заданиями, оба процесса, созданные для программ cat(l) иsort(l), будут помещены в отдельную группу. Это подтверждается выводомкомандыне менее в системе будут продолжать выполняться процессы, запущенные в фоновомрежиме. Этотакже не справедливо для демонов — процессов, являющихсянами сеанса,имеющего управляющего терминала.
Система не имеет возможности авто!матического отправления сигналатаким процессам при выходе пользователя, и онибудут продолжать выполняться даже после завершения пользователем работы вДля"превращения" процесса в демона, он должен воспользоваться функциейи создатьновый сеанс,которого он автоматически окажется и который не будет ассоцииро!ван с управляющим терминалом.
Эти вопросы будут более подробно обсуждены при иллю!страции программы!демонав этой главе.Наличие текущей и фоновых группв сеансе работы пользователя зависит отвозможности командного интерпретатора управлять заданиями (job control). При отсутст!вии этой возможности все процессы будут выполняться в той же группе, что и shell.www.books-shop.comГлава 2.$ ps !efjпрограммирования UNIX| egrep2436 24072431 2407andy 2407 2405andy 2435 24072435243124072435SIDС2407 1 15:51:302407 0 15:51:252407 0 15:31:092407 0 15:51:30TTYttyOlttyOlTIME0:000:000:000:00CMDsortfind / name fooshcatВсе четыре процесса (sh, find, cat и sort) имеют один и тот же идентифика!тор сеанса, связанного с управляющим терминалом ttyOl. Процессыипринадлежат одной группе, идентификатор которой (2435) отли!чен от идентификатора группы командного интерпретатора (2407). То жесамое можно сказать и о процессе find(l), который является лидером от!дельной группы (2431).
Можно также заметить, что процессыиявляются лидерами групп, aеще и лидером сеанса.Хотя команда ps(l) не указывает, какие группы являются фоновыми, а какаятекущей, синтаксис команд позволяет утверждать, что командный интерпре!татор помещает cat(l) ив текущую группу. Это, во!первых, позволяетпроцессу cat(l) читать данные со стандартного потока ввода, связанного стерминалом ttyOl. Во!вторых, пользователь имеет возможность завершитьвыполнение обоих процессов путем нажатия клавиши <Del> (иличто вызовет генерацию сигнала SIGINT. Получение процесса!ми этого сигнала вызовет завершение их выполнения (действие по умолча!нию), если, конечно, процесс не установил игнорирование SIGINT.
Нарис.представлена схема взаимодействия управляющего терминала, се!анса и групп процессов для приведенного выше примера. Более детально вза!имосвязь между терминалом и процессами рассмотрена в следующей главе.Рис. 2.13. Связь между управляющим терминалом, сеансом и группамиwww.books-shop.comПроцессыЕсли командный интерпретатор не поддерживает управление заданиями,оба процесса станут членами той же группы, что и сам shell. В этом случаекомандный интерпретатор должен позаботиться об игнорировании сигна!лов S I G I N T ичтобы допустимые действия пользователя (такиекак нажатие клавиши <Del> или <Ctrl>+<C>) не привели к завершениювыполнения shell и выходу из системы.ОграниченияUNIX является многозадачной системой.
Это значит, что несколько процес!сов конкурируют между собой при доступе к различным ресурсам. Для"справедливого" распределения разделяемых ресурсов, таких как память,дисковое пространство и т. п., каждому процессу установлен набор ограни!чений. Эти ограничения не носят общесистемного характера, как, напри!мер, максимальное число процессов или областей, а устанавливаются длякаждого процесса отдельно. Для получения информации о текущих ограни!чениях и их изменения предназначены системные вызовыиttincludeintintresource, struct rlimitresource, const struct rlimitАргумент resource определяет вид ресурса, для которого мы хотим узнатьили изменить ограничения процесса.
Структура rlimit состоит из двухполей:определяющих, соответственно, изменяемое (soft) и жесткое (hard) ограни!чение. Первое определяет текущее ограничение процесса на данный ре!сурс, а второе — максимальный возможный предел потребления ресурса.Например, изменяемое ограничение на число открытых процессом файловможет составлять 64, в то время как жесткое ограничение равно 1024.Любой процесс может изменить значение текущего ограничения вплоть домаксимально возможного предела. Жесткое ограничение может быть из!менено в сторону увеличения предела потребления ресурса только процес!сом с привилегиями суперпользователя. Обычные процессы могут толькоуменьшить значение жесткого ограничения.
Обычно ограничения устанав!ливаются при инициализации системы и затем наследуются порожденны!ми процессами (хотя в дальнейшем могут быть изменены).Вообще говоря, максимальный возможный предел потребления ресурсаможет иметь бесконечное значение. Для этого необходимо установить зна!чение rlim_max равным RLIM_INFINITY. В этом случае физические огра!ничения системы (например, объем памяти и дискового пространства) бу!дут определять реальный предел использования того или иного ресурса.Различные ограничения и связанные с ними типы ресурсов приведены втабл. 2.21.www.books-shop.comГлава 2.
Среда программирования UNIX178Таблица 2.21. Ограничения процесса (значения аргумента resource)ОграничениеТип ресурсаЭффектМаксимальный размер соз%даваемого файла core, со%держащего образпамятипроцесса. Если предел уста%новлен равным 0, файл coreсоздаваться не будет.Максимальное время исполь%зования процессора в секун%дах.После создания файла core за%пись в этот файл будет останов%лена при достижении предельно%го размера.При превышении предела про%цессуотправляетсясигналSIGXCPU.Максимальный размер сег% При достижении этого пределамента данных процесса в бай% последующие вызовы функциитах, т. е. максимальное значе% brk(2) завершатся с ошибкойние смещения брейк%адреса.FSIZEМаксимальный размер фай%ла, который может создатьпроцесс.
Если значение этогопредела равно 0, процесс неможет создавать файлы.При достижении этого пределапроцессу отправляется сигналSIGXFSZ. Если сигнал перехва%тывается или игнорируется про%цессом, последующие попыткиувеличить размер файла закон%чатся С Ошибкой EFBIG.RLIMIT NOFILEМаксимальноеколичество При достижении этого предела,назначенных файловых деск% последующие попытки получитьрипторов процесса.новый файловый дескрипторзакончатся с ошибкой EMFILE.RLIMIT STACKМаксимальный размер стека При попытке расширить стек заустановленный предел отправля%процесса.ется сигнал SIGSEGV. Если про%цесс перехватывает или игнори%рует сигнал и не использует аль%тернативный стек с помощьюфункциидиспози%ция сигнала устанавливается надействие по умолчанию передотправкой процессу.Максимальный размер ото% При достижении этого пределабражаемой памяти процесса последующие вызовы brk(2) илизавершатся с ошибкойв байтах.
(Предел определенENOMEM.в версиях System V.)RLIMIT NPROCМаксимальное число процес%сов с одним реальнымОпределяетмаксимальноечисло процессов, которые мо%жет запустить пользователь.(Предел определен в версияхBSD UNIX.)При достижении этого предела,последующие вызовыдляпорождения нового процессазавершатся с ошибкойwww.books-shop.comПроцессыТаблица 2.21 (окончание)ОграничениеR L I M I T MEMLOCKТип ресурсаЭффектМаксимальный размер в бай%тах резидентной части про%цесса (RSS — Resident SetSize).Определяет макси%мальное количество физиче%ской памяти, предоставляе%мой процессу.
(Предел опре%делен в версиях BSD UNIX.)Если система ощущает недоста%ток памяти, ядро освободит па%мять за счет процессов, превы%сивших свой RSS.Максимальныйфизи% При превышении предела сис%ческой памяти (физических темный вызов mlock(2) завер%страниц) в байтах, который шится С Ошибкой EAGAIN.процесс может заблокироватьс помощью системного вызо%ва mlock(2). (Предел опреде%лен в версиях BSD UNIX.)В заключение приведем пример программы, выводящий на экран установ!ленные о г р а н и ч е н и я для процесса:вывода на экран текущего и максимального пределовпотребления ресурсаvoidresource, char *rname){struct rlimitifизменяемого==elseprintf (жесткогоif==printfelse}STACK, "RLIMITȾɚɧɧɚɹɜɟɪɫɢɹɤɧɢɝɢɜɵɩɭɳɟɧɚɷɥɟɤɬɪɨɧɧɵɦɢɡɞɚɬɟɥɶɫɬɜɨɦ%RRNVVKRSɊɚɫɩɪɨɫɬɪɚɧɟɧɢɟɩɪɨɞɚɠɚɩɟɪɟɡɚɩɢɫɶɞɚɧɧɨɣɤɧɢɝɢɢɥɢɟɟɱɚɫɬɟɣɁȺɉɊȿɓȿɇɕɈɜɫɟɯɧɚɪɭɲɟɧɢɹɯɩɪɨɫɶɛɚɫɨɨɛɳɚɬɶɩɨɚɞɪɟɫɭpiracy@books-shop.comГлава 2.программирования UNIX/* BSD */RLIMIT_NPROC/* BSD */ttifdef/* BSD */ttifdef RLIMIT_MEMLOCK)#endif/* System V */#endif}Запуск программы под управлением операционной системы Solaris 2.5 дастследующие результаты:$infiniteinfinite2147479552infinite648388608infiniteinfiniteinfinite2147479552infinite10242147479552infiniteПримеры программВ качестве заключительной иллюстрации к обсуждавшимся выше вопро!сам приводятся фрагменты двух приложений, которые в достаточной сте!пени демонстрируют практическое применение программного интерфейсаUNIX.