Разработка приложений в среде Linux. Второе издание
Шрифт:
Наиболее удобным способом является установка флага закрытия после выполнения для каждого файла, который программа оставляет открытым на длительный период времени (включая сокеты и файловые устройства), что предотвращает получение доступа к данным файлам новыми запускаемыми программами. Описание флага закрытия после выполнения можно найти в главе 11.
22.4. Запуск в качестве демона
При разработке программ, создаваемых для работы в качестве системных демонов, нужно очень внимательно проводить их становление как демонов для правильного определения всех деталей. Ниже приведен перечень тех обстоятельств, на которые необходимо обратить внимание.
1. Большинство действий по инициализации должны быть произведены до того, как программа становится фактическим демоном. Это гарантирует, что пользователь при
2. Текущий каталог должен быть изменен на какой-либо подходящий. Это может быть корневой каталог, но никогда не может быть тот каталог, из которого была запущена программа. Если демон этого не сделает, то, возможно, он будет работать соответствующим образом, но это не позволяет удалить тот каталог, из которого он был активизирован, поскольку он остается текущим каталогом программы. Если это возможно, то неплохо применить
3. Все ненужные файловые дескрипторы должны быть закрыты. Это может показаться очевидным, однако вы легко можете упустить закрытие тех дескрипторов, которые были унаследованы, а не открыты самой программой. Об этом речь шла в предыдущем разделе.
4. Затем программа должна вызвать
5. Дочерний процесс, продолжающий работу, должен закрыть stdin, stdout и stderr, поскольку он не будет больше использовать терминал. Вместо повторного применения файловых дескрипторов 0, 1 и 2 лучше открывать эти файлы как
6. Для полного разъединения с терминалом, из которого был запущен демон, он должен вызвать
Библиотека С предлагает функцию
Данная функция сразу осуществляет ветвление, и если оно прошло успешно, родительский процесс вызывает
Часть IV
Библиотеки для разработки
Глава 23
Сопоставление строк
Осуществлять сравнение строк можно не только с помощью функции
23.1. Универсализация произвольных строк
В главе 14 мы говорили о том, как с помощью функции
Предложенный
шаблон является стандартным выражением универсализации с четырьмя специальными символами, за которые отвечает аргумент* | Соответствует любой строке, включая пустую. |
? | Соответствует любому одиночному символу. |
[ | Начинает список символов для сопоставления или, если следующим символом является ^ , то список символов для несовпадения. Весь список может совпадать, или не совпадать с одним символом. Список заканчивается знаком ] . |
\ | Следующий символ будет интерпретироваться как литерал, а не как специальный символ. |
На результаты универсализации влияет аргумент
FNM_NOESCAPE | Обработка символа \ как обычного, а не специального символа. |
FNM_PATHNAME | Символы / в строке string не сопоставляются с последовательностью * , ? , или даже [/] в шаблоне pattern ; сопоставление производится только с литералом, а не специальным символом / . |
FNM_NOESCAPE | Первый символ . в шаблоне pattern соответствует символу . в строке string только в том случае, если он является первым символом в строке string или если задано значение FNM_PATHNAME , а символ . в string непосредственно следует за символом \ . |
Функция
Пример использования функции
23.2. Регулярные выражения
Регулярные выражения, используемые в программах
23.2.1. Регулярные выражения в Linux
Существуют две разновидности регулярных выражений: базовые регулярные выражения (basic regular expression — BRE) и расширенные регулярные выражения (extended regular expression — ERE). Они соответствуют (в первом приближении) командам grep и egrep. Описание каждой разновидности регулярных выражений можно найти на man-странице grep, в стандарте POSIX.2 (IEEE, 1993), в [32], а также в других источниках, поэтому здесь мы не станем описывать их синтаксис, а рассмотрим только интерфейс функции, с помощью которой вы сможете применять регулярные выражения в своих программах.