Читать книгу 📗 "Операционная система UNIX - Робачевский Андрей Михайлович"
В заключение приведем пример программы, выводящий на экран установленные ограничения для процесса:
#include <sys/types.h>#include <sys/resource.h>/* Процедура вывода на экран текущего и максимального пределов потребления ресурса resource */void disp_limit(int resource, char *rname) { struct rlimit rim; getrlimit(resource, &rlm); printf("%-13s ", rname); /* Значение изменяемого ограничения */ if (rlm.rlim_curr == RLIM_INFINITY) printf("infinite "); else printf("%101d ", rlm.rlim_cur); /* Значение жесткого ограничения */ if (rlm.rlim_max == RLIM_INFINITY) printf("infinite n"); else printf("%10ldn", rlm.rlim_max);}main() { disp_limit(RLIMIT_CORE, "RLIMIT_CORE"); disp_limit(RLIMIT_CPU, "RLIMIT_CPU"); disp_limit(RLIMIT_DATA, "RLIMIT_DATA"); disp_limit(RLIMIT_FSIZE, "RLIMIT_FSIZE"); disp_limit(RLIMIT_NOFILE, "RLIMIT_NOFILE"); disp_limit(RLIMIT_STACK, "RLIMIT_STACK"); /* BSD */#ifdef RLIMIT_NPROC disp_limit(RLIMIT_NPROC, "RLIMIT_NPROC");#endif /* BSD */#ifdef RLIMIT_RSS disp_limit(RLIMIT_RSS, "RLIMIT_RSS");#endif /* BSD */#ifdef RLIMIT_MEMLOCK disp_limit(RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK");#endif /* System V */#ifdef RLIMIT_VMEM disp_limit(RLIMIT_VMEM, "RLIMIT_VMEM");#endif}Запуск программы под управлением операционной системы Solaris 2.5 даст следующие результаты:
$ <b>а.out</b>RLIMIT_CORE infinite infiniteRLIMIT_CPU infinite infiniteRLIMIT_DATA 2147479552 2147479552RLIMIT_FSIZE infinite infiniteRLIMIT_NOFILE 64 1024RLIMIT_STACK 8388608 2147479552RLIMIT_VMEM infinite infiniteПримеры программ
В качестве заключительной иллюстрации к обсуждавшимся выше вопросам приводятся фрагменты двух приложений, которые в достаточной степени демонстрируют практическое применение программного интерфейса UNIX. Заметим, что приведенные примеры не являются законченными программами — во многих местах участки кода намеренно опущены, а функциональность сведена к минимуму. Задачей являлось показать принцип взаимодействия программ с операционной системой и идеологию программирования в UNIX. Рассмотрим два диаметрально противоположных приложения — неинтерактивную программу-демон и интерактивный командный интерпретатор.
Демон
Демоны играют важную роль в работе операционной системы. Достаточно будет сказать, что возможность терминального входа пользователей в систему, доступ по сети, использование системы печати и электронной почты, — все это обеспечивается соответствующими демонами — неинтерактивными программами, составляющими собственные сеансы (и группы) и не принадлежащими ни одному из пользовательских сеансов (групп).
Некоторые демоны работают постоянно, наиболее яркий пример такого демона — процесс init(1M), являющийся прародителем всех прикладных процессов в системе. Другими примерами являются cron(1M), позволяющий запускать программы в определенные моменты времени, inetd(1M) обеспечивающий доступ к сервисам системы из сети, и sendmail(1M), обеспечивающий получение и отправку электронной почты.
При описании взаимодействия процессов с терминалом и пользователем в разделе "Группы и сеансы", отмечалось особое место демонов, которые не имеют управляющего терминала. Теперь в отношении демонов можно сформулировать ряд правил, определяющих их нормальное функционирование, которые необходимо учитывать при разработке таких программ:
1. Демон не должен реагировать на сигналы управления заданиями, посылаемые ему при попытке операций ввода/вывода с управляющим терминалом. Начиная с некоторого времени, демон снимает ассоциацию с управляющим терминалом, но на начальном этапе запуска ему может потребоваться вывести то или иное сообщение на экран.
2. Необходимо закрыть все открытые файлы (файловые дескрипторы), особенно стандартные потоки ввода/вывода. Многие из этих файлов представляют собой терминальные устройства, которые должны быть закрыты, например, при выходе пользователя из системы. Предполагается, что демон остается работать и после того, как пользователь "покинул" UNIX.
3. Необходимо снять его ассоциацию с группой процессов и управляющим терминалом. Это позволит демону избавиться от сигналов, генерируемых терминалом (
SIGINTSIGHUP4. Сообщения о работе демона следует направлять в специальный журнал с помощью функции syslog(3), — это наиболее корректный способ передачи сообщений от демона.
5. Необходимо изменить текущий каталог на корневой. Если этого не сделать, а текущий каталог, допустим, находится на примонтированной файловой системе, последнюю нельзя будет размонтировать. Самым надежным выбором является корневой каталог, всегда принадлежащий корневой файловой системе.
Приведем скелет программы-демона:
#include <stdio.h>#include <syslog.h>#include <signal.h>