<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Модулb threads, Sys::SigAction и команда alarm.</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/6819.html</link>
    <description>Не могу победить реализацию таймаута в треде.&lt;br&gt;&lt;br&gt;Вот код, который работает:&lt;br&gt;-------------------------------------------------------------------------&lt;br&gt;#!/usr/bin/perl -w&lt;br&gt;use strict;&lt;br&gt;use threads;&lt;br&gt;use Sys::SigAction qw( set_sig_handler );&lt;br&gt;t();&lt;br&gt;sub t &#123;&lt;br&gt;   eval &#123;&lt;br&gt;      set_sig_handler( &apos;ALRM&apos;, sub &#123; die &apos;alarm!&apos; &#125; );&lt;br&gt;      alarm(1); # определяем таймаут в 1 сек.&lt;br&gt;      sleep(10); # здесь вместо sleep должен быть полезный код&lt;br&gt;      alarm(0);&lt;br&gt;   &#125;;&lt;br&gt;   alarm(0);&lt;br&gt;   if( $&#064; ) &#123;&lt;br&gt;      print &quot;Timeout!&#092;n&quot;;&lt;br&gt;   &#125;&lt;br&gt;   else &#123;&lt;br&gt;      print &quot;Ok&#092;n&quot;;&lt;br&gt;   &#125;&lt;br&gt;&#125;&lt;br&gt;-------------------------------------------------------------------------&lt;br&gt;Т.е. реализация таймаута нормально отрабатывает&lt;br&gt;&lt;br&gt;А вот код, который не работает (меняем только одну строчку вызова функции t):&lt;br&gt;-------------------------------------------------------------------------&lt;br&gt;#!/usr/bin/perl -w&lt;br&gt;use strict;&lt;br&gt;use threads;&lt;br&gt;use Sys::SigAction qw( set_sig_handler );&lt;br&gt;threads-&amp;gt;new( &#092;&amp;t )-&amp;gt;join(); # вместо простого вызова функции t&lt;br&gt;sub t &#123;&lt;br&gt;   eval &#123;&lt;br&gt;      s</description>

<item>
    <title>Модулb threads, Sys::SigAction и команда alarm. (jr)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/6819.html#4</link>
    <pubDate>Wed, 07 Nov 2007 11:54:21 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;sub Tail &#123; &lt;br&gt;&amp;gt;   $SIG&#123;&apos;KILL&apos;&#125; = sub &#123; close(TFH); threads-&amp;gt;exit(); &#125;;&lt;br&gt;&amp;gt;   open(TFN,&apos;tail -F -n 0 some_file &amp;#124;&apos;); &lt;br&gt;&amp;gt;   while(&amp;lt;TFN&amp;gt;) &#123;&lt;br&gt;&amp;gt;      ... &lt;br&gt;&amp;gt;   &#125; &lt;br&gt;&amp;gt;   return $some; &lt;br&gt;&amp;gt;&#125; &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;работает, до тех пор пока в файл что-то пишется. Если файл не изменяется, то всё залипает на &apos;while(&amp;lt;TFN&amp;gt;)&apos;.&lt;br&gt;&lt;br&gt;Насколько я понял изучая вопрос, треды и сигналы (в понимании, в котором сигналы и должны быть) в perl не работают...&lt;br&gt;Мне пришлось все на fork переделывать, т.к. без ALRM я не смог обойтись.&lt;br&gt;</description>
</item>

<item>
    <title>Модулb threads, Sys::SigAction и команда alarm. (alexvs)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/6819.html#3</link>
    <pubDate>Wed, 07 Nov 2007 11:47:05 GMT</pubDate>
    <description>&amp;gt;man perlthtut &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Similarly, mixing signals and threads should not be attempted.  Implementations are &lt;br&gt;&amp;gt;platform-dependent, and even the POSIX semantics may not be what you &lt;br&gt;&amp;gt;expect (and Perl doesn&apos;t even give you the full POSIX API). &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;для тредов есть другие методики, позволяющие реализовать подобное. &lt;br&gt;&lt;br&gt;Ответ просто &quot;радует&quot; своей полнотой и просветляющей способностью :(&lt;br&gt;&lt;br&gt;Есть тред в котором открываю пайп и читаю из него. Как убить тред через N секунд? &lt;br&gt;my $first = threads-&amp;gt;create(&#092;&amp;Tail);&lt;br&gt;sleep(10);&lt;br&gt;my $some = $first-&amp;gt;kill(&apos;KILL&apos;)-&amp;gt;join();&lt;br&gt;&lt;br&gt;sub Tail &#123;&lt;br&gt;   $SIG&#123;&apos;KILL&apos;&#125; = sub &#123; close(TFH); threads-&amp;gt;exit(); &#125;;&lt;br&gt;   open(TFN,&apos;tail -F -n 0 some_file &amp;#124;&apos;);&lt;br&gt;   while(&amp;lt;TFN&amp;gt;) &#123;&lt;br&gt;      ...&lt;br&gt;   &#125;&lt;br&gt;   return $some;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;работает, до тех пор пока в файл что-то пишется. Если файл не изменяется, то всё залипает на &apos;while(&amp;lt;TFN&amp;gt;)&apos;.&lt;br&gt;</description>
</item>

<item>
    <title>Модулb threads, Sys::SigAction и команда alarm. (jr)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/6819.html#2</link>
    <pubDate>Mon, 08 Oct 2007 11:58:05 GMT</pubDate>
    <description>&amp;gt;man perlthtut &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Similarly, mixing signals and threads should not be attempted.  Implementations are &lt;br&gt;&amp;gt;platform-dependent, and even the POSIX semantics may not be what you &lt;br&gt;&amp;gt;expect (and Perl doesn&apos;t even give you the full POSIX API). &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;для тредов есть другие методики, позволяющие реализовать подобное. &lt;br&gt;&lt;br&gt;Хм... а где о них, о методиках этих почитать можно?&lt;br&gt;</description>
</item>

<item>
    <title>Модулb threads, Sys::SigAction и команда alarm. (angra)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/6819.html#1</link>
    <pubDate>Mon, 08 Oct 2007 11:53:17 GMT</pubDate>
    <description>man perlthtut&lt;br&gt;&lt;br&gt;Similarly, mixing signals and threads should not be attempted.  Implementations are platform-dependent, and even the POSIX semantics may not be what you expect (and Perl doesn&apos;t even give you the full POSIX API).&lt;br&gt;&lt;br&gt;для тредов есть другие методики, позволяющие реализовать подобное.&lt;br&gt;</description>
</item>

</channel>
</rss>
