Личный кабинет    
Назад К началу Вперед Карта сайта Телефонные коды стран и городов Мира Анализатор тарифов Служб IP-Телефонии и Рейтинг

Разделы
Введение
Литература
Операторы
Оборудование
Анализатор
Сотрудничество
Печать карт
Новости
Опросник
Коды
Справка
Работа
Каталог
Хостинг
Личный кабинет

Реклама

Perl для IP-Телефонии (32 – TCP клиент/сервер, часть 23)

предыдущая часть ««»» следующая часть

Чтобы определить группу процесса для конкретного процесса, можно вызвать функцию getpgrp () языка Perl и передать функции kill () отрицательное значение идентификатора группы процесса для отправки од­ного и того же сигнала одновременно всем членам группы. Именно так действует командный интерпретатор, отправляя сигнал HUP всем своим подпроцессам непосредственно перед завершением работы. Дочерний процесс, вновь созданный путем ветвления, принадлежит к той же группе сеанса и группе процесса, что и его родительский процесс. Подобным ветвлением можно одновременно выполнять несколько задач.

Подпрограмма become_daemon () 

use POSIX 'setsid';
sub become_daemon {
die "Can’t fork" unless defined (my $child = fork);
exit 0 if $child;    # Завершение родительского процесса
setsid () ;        # Преобразование    в    лидера сеанса
open(STDIN,"open(STDOUT,">/dev/null");
open(STDERR,">&STDOUT");
chdir '/';         # Смена рабочего каталога
umask (0);         # Сброс маски режима создания файла
$ENV{PATH} =  '/bin:/sbin:/usг/bin:/usr/sbin';
return $$;
}

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

После вызова функции setsid () дескрипторы файлов STDIN и STDOUT вновь от­крываются в специальное “ничего не выполняющее” устройство /dev/null, а деск­риптор STDERR становится копией дескриптора STDOUT (строки 5-7). Это позволяет исключить возможность появления выходных данных демона на терминале. Затем вызывается функция chdir () для перехода из текущего каталога в корневой каталог файловой системы, переустанавливается маска создания файлов в значение 0 и пере­менная среды PATH определяется равной небольшому числу стандартных каталогов (строка 10). Возвращается новый идентификатор процесса из глобальной перемен­ной $$. Поскольку было выполнено ветвление, теперь идентификатор процесса от­личается от того, с которым была вызвана эта подпрограмма, и явный возврат нового значения PID таким образом — это для любого программиста хороший способ напом­нить самому себе об этом факте.



2014-06-02 13:27:12

предыдущая часть ««»» следующая часть


ДОКУМЕНТАЦИЯ VoIP


НОВОСТИ СВЯЗИ


РЕКОМЕНДУЕМ

 
[ стандарты | обзор | оборудование | анализатор | коды | новости | карта | партнерам | Мы ВКонтаке ]
Запрещается копировать материалы сайта без уведомления авторов.
С вопросами и предложениями обращайтесь со страницы контактов
Copyright c 1999-2024 IPTop.Net
 
IP-Телефония, Интернет Телефония, Компьютерная телефония