Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
2mozart Прошу по-хорошему - закрой тему. Кажется, ты уже получил ответ на вопрос. 18.04.03 18:13 Число просмотров: 1364
Автор: Ktirf <Æ Rusakov> Статус: Elderman Отредактировано 18.04.03 20:39 Количество правок: 1
|
|
<programming>
|
[Perl] fork() объясните смысл 16.04.03 13:14 [Ktirf, JINN, PS, Sandy]
Автор: choor Статус: Elderman
|
Зачем создавать копию процесса? НА простом примере.
|
|
2mozart Прошу по-хорошему - закрой тему. Кажется, ты уже получил ответ на вопрос. 18.04.03 18:13
Автор: Ktirf <Æ Rusakov> Статус: Elderman Отредактировано 18.04.03 20:39 Количество правок: 1
|
|
|
[Perl] fork() объясните смысл 16.04.03 18:01
Автор: vh <Дмитрий> Статус: Member
|
это такой суперский метод создания процесса в юниксе.
несколько непривычен и кажется странным для тех кто до это программировал в Windows.
но может быть сведен к ее стандартной CreateProcess
фича в том, что юниксовский метод порождения процесса является более гибким.
ты об этом спрашивал, или я не понял?
|
|
[Perl] Демонизация 16.04.03 17:58
Автор: whiletrue <Роман> Статус: Elderman Отредактировано 16.04.03 23:00 Количество правок: 5
|
#!/usr/bin/perl
use strict;
use POSIX ":sys_wait_h";
my $PidFile = "/var/run/<твой пид>.pid"; # PID-файл (идентификатор процесса)
my $RefreshInterval = 10;
Daemonize();
sub Process {
#Комманды демонизированного процесса
}
sub Daemonize {
# При живом демоне не запускаемся
if (TestMinion()){
print "xxx is already running\n\n";
exit(1);
}
my $NPId = fork(); # ! ВЕТВИМСЯ !
if ($NPId){ # Родитель
print "My pid is: ", $$, "\n";
print "Daemon pid is: ", $NPId, "\n";
open(FH, "+>" . $PidFile); # PID процесса - потомка
print FH $NPId;
close(FH);
exit(0); # Выходим
} else { # Демон
POSIX::setsid(); # Отваливаем
# Обработчики сигналов
$SIG{'INT'} = "IGNORE";
$SIG{'HUP'} = "IGNORE";
$SIG{'TERM'} = \&SigTERM;
$SIG{'CHLD'} = "IGNORE";
for (;;){
Process();
sleep($RefreshInterval); # Спим
}
}
}
sub SigTERM {
unlink($PidFile);
exit(0);
}
#
# Проверка наличия процесса в памяти
#
sub TestMinion{
my $NStatus = 0;
if (-f $PidFile){ # Если есть такой pid файл
open(FH, "<" . $PidFile); # Читаем pid
my $NRootPId = <FH>;
close(FH);
if ($NRootPId) { # Если есть pid
if (kill(0, $NRootPId)) { $NStatus = 1; # Если процесс жив
} else { unlink($PidFile); } # иначе - стираем файл
}
}
return $NStatus
}
---
|
|
На fork() основана вся многозадачность UNIX. Или тебя интересует именно приложение к Перлу? 16.04.03 16:05
Автор: Ktirf <Æ Rusakov> Статус: Elderman
|
|
|
Поясняю, в меру своих знаний. 16.04.03 13:29
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman Отредактировано 16.04.03 13:33 Количество правок: 3
|
> Зачем создавать копию процесса? НА простом примере. 1) Что бы запустить другую задачу, не завершая исходную: Сначала делается копия, потом она замещается (spawn) на другую задачу.
2) Если система многопроцессорная и необходимо выполнить несколько задач, которые могут выполняться параллельно, для решения основной задачи, которая может быть разбита на эти параллельные задачи (криптоанализ перебором например).
|
|
|