Hallo,
Hintergrundsituation:
ich hab einen lang laufenden Prozess der eine bestimmte
Timeout X mit alarm(X); gesetzt hat.
Dieser Prozess ruft nun LWP auf, welcher einzelne bis viele
URLs sammeln soll (ja, ein Spider).
Nun moechte ich bei diesen LWP-Gets auch die dortige Timeout-Funktion benutzen
(und muss es sogar weil einige URLs Probleme machen)...
Aber anscheinend geht dies nicht, denn:
(LWP::UserAgent):
...
if ($use_alarm) {
$SIG{'ALRM'} = sub {
LWP::Debug::trace('timeout');
die 'Timeout';
};
$protocol->timeout($timeout);
alarm($timeout);
}
...
Die Manual zu 'alarm' sagt aber:
"Alarm requests are not stacked; successive calls reset the
alarm clock of the calling process. "
Weiter steht da was nettes ueber LWP (warum steht das nicht in perldoc LWP, verdammich??!):
" o if the calling thread is a bound thread, the resulting
SIGALRM is delivered to the bound thread's LWP, i.e. to
the calling thread. There is a bug currently that this
signal is not maskable via thr_sigsetmask(3T) on this
bound thread.
o if the calling thread is an unbound thread, the resulting
SIGALRM is sent to the LWP on which the thread was running
when it issued the call to alarm(). This is neither a
per-process semantic, nor a per-thread semantic, since the
LWP could change threads after the call to alarm() but
before the SIGALRM delivery, causing some other thread to
get it possibly. Hence this is basically a bug.
"
In anderen Worten: Ich kann nicht in meinen Programm alarm() nutzen UND
gleichzeitig von LWP die Timeout-Funktion eingeschaltet lassen (per default ist diese
uebrigens an!).
Lange Rede, kurzer Sinn: Hat jemand eine Ahnung, wie ich dies
umgehen kann, also sowohl alarm() in meinem Hauptprogramm,
als auch den von LWP gleichzeitig nutzen?
(Immer im Hinterkopf, das die Alarmzeit vom
Hauptprogramm != Timeout von LWP)
Ciao,
Wolfgang