LINUX.ORG.RU

perl threads и сигналы


0

0

использую потоки в perl use threads;
Есть задача послать HUP сигнал каждому потоку,
но как то странно это все работает, к примеры есть главный PID
начального процесса и PIDы созданных потоков и вот если я вызываю
kill -HUP PID_начального_процесса ни чего не происходит,
а если пишу kill -HUP PID_порожденного_процесса то сигнал обрабатывается.
Как правильно сделать?

★★

может мне склероз изменяет, но сигналы доставляются каждому потоку.

anonymous
()

если у тебя потоки имеют pid-ы то ето говорит о кривой реализации твоей системы. У потоков их нет и быть не должно.

cvv ★★★★★
()
Ответ на: комментарий от cvv

Проверил, на Mandrake 9.2 perl v5.8.1 потоки имеют PIDы,
а на RHEL 3 perl v5.8.0 тотже самый код исполняется с одним PIDом,
вот это странно.
Сейчас попробую разобратся с сигналами...

Но похоже процес порадившый процес останавливается, и далше исполняются только потоки, ниже код может вам будет интересно:

#!/usr/bin/perl -w

use strict;
use threads;
use sysLog;

my $debug = 9;
#print "PID=$$\n";

my @f = ("/var/log/samba/smbd.log","/var/log/vsftpd.log","/home /robot/bin/robot/logs/logfile");
my (%th,%thr,$i);

for($i = 0; $i < @f; $i++){
$th{$i} = new sysLog($f[$i],$i+1);
}
$SIG{HUP} = 'root_handler';

&root_handler();
&start();
&join();

sub root_handler{
print "$0-dbg-9- ROOT_HANDLER\n" if($debug > 7);
my $i;
for $i (keys %th){
$th{$i}->handler();
}
}
sub start{
my $i;
for $i (keys %th){
$thr{$i} = new threads \&run,$th{$i};
}
}
sub join{
my $i;
for $i (keys %th){
$thr{$i}->join();
}
}

sub run {
my $th = shift;
$th->read();
}



arum ★★
() автор топика
Ответ на: комментарий от arum

>Проверил, на Mandrake 9.2 perl v5.8.1 потоки имеют PIDы,

на старых ядрах для работы потоков _иногда_ задействовались несколько дополнительных процессов дабы простым способом обеспечить увеличение производительности при запуске на нескольких процессорах. Вообщето ети дополнительные процессы никому не мешают но получается идеологически некрасиво. причём однозначного соответствия процесс-поток обычно не существует.

>а на RHEL 3 perl v5.8.0 тотже самый код исполняется с одним PIDом, вот это странно.

просто в етой версии ядра потоки больше приблизили к человеческому виду.

cvv ★★★★★
()
Ответ на: комментарий от arum

>Но похоже процес порадившый процес останавливается, и далше исполняются только потоки, ниже код может вам будет интересно

в корне не верно. если останавливается породивший процесс то останавливаются ВСЕ порождённые потоки. если ты имел ввиду что остановился основной поток процесса то только потому что ты его собственноручно остановил.

cvv ★★★★★
()
Ответ на: комментарий от arum

man pthread_kill:

POSIX standard:

According to the standard, ``asynchronous'' (external) signals are addressed to the whole process (the collection of all threads), which then delivers them to one particular thread. The thread that actually receives the signal is any thread that does not currently block the signal.

In LinuxThreads, each thread is actually a kernel process with its own PID, so external signals are always directed to one particular thread. If, for instance, another thread is blocked in sigwait on that signal, it will not be restarted.

The LinuxThreads implementation of sigwait installs dummy signal handlers for the signals in set for the duration of the wait. Since signal handlers are shared between all threads, other threads must not attach their own signal handlers to these signals, or alternatively they should all block these signals (which is recommended anyway -- see the Notes section).

cvv ★★★★★
()
Ответ на: комментарий от cvv

man 3T pthread :

....

SIGNALS

In a multithreaded process, all threads share signal actions. That is, a signal handler established by one thread is used in all threads. However, each thread has a separate signal mask, by which it can selectively block signals.

Signals can be sent to other threads within the same process, or to other processes. When a signal is sent to the process, exactly one thread which does not have that signal blocked will handle the signal. When sent to a thread within the same process, that thread will handle the signal, perhaps later if the signal is blocked. Signals whose action is to terminate, stop, or continue will terminate, stop, or continue the entire process, respectively, even if directed at a particular thread.

pthread_kill() Sends a signal to the given thread.

pthread_sigmask() Blocks selected signals for the thread.

sigwait(), sigwaitinfo(), sigtimedwait()

*These functions synchronously wait for given signals.

cvv ★★★★★
()
Ответ на: комментарий от cvv

тоесть в какомто одном потоке ловиш внешний сигнал а потом рассылаеш его всем потокам твоего процесса например при помощи phread_kill

cvv ★★★★★
()

А не проще это сделать через форки и вообще стандартно. Чем отличается thread от форкнутого чайлда?

vilfred ☆☆
()
Ответ на: комментарий от vilfred

threads это модно, вот в Java есть thread и в Perle они теперь есть :)

И мне кажется стандарты Perlа смещаются как раз к threads и Object,
а fork остаётся в прошлом.(мое мнение)
Я пробывал, тоже самое и через fork, но захотелось разобратся с потоками.

arum ★★
() автор топика
Ответ на: комментарий от arum

>И мне кажется стандарты Perlа смещаются как раз к threads и Object,

помоему ето кажется только тебе

>а fork остаётся в прошлом.(мое мнение)

никогда. с ним намного меньше геммора чем с тредами

>Я пробывал, тоже самое и через fork, но захотелось разобратся с потоками.

в других случаях стоит семь раз подумать прежде чем связатся с потоками

cvv ★★★★★
()
Ответ на: комментарий от arum

ну, меня эти форки IPC и сокеты кормят насучным хлебом. Там ТАКОЕ можно делать и причем настолько нехитро, благодаря CPAN....

vilfred ☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.