<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> <dfn><code>AnyEvent::Fork</code></dfn> は、 <code>AnyEvent</code> 環境で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">子プロセス</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">起動</anchor>して
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">スクリプト</anchor>を実行させるための<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perlモジュール</anchor>です。</p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <cite>AnyEvent::Fork - search.cpan.org</cite>
(<time>2016-10-20 18:41:14 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://search.cpan.org/dist/AnyEvent-Fork/Fork.pm">http://search.cpan.org/dist/AnyEvent-Fork/Fork.pm</anchor-external></li></ul></refs><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <cite>AnyEvent::Fork clarification</cite>
(<time>2014-01-11 23:06:25 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://lists.schmorp.de/pipermail/anyevent/2014q1/000634.html">http://lists.schmorp.de/pipermail/anyevent/2014q1/000634.html</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> <code>fork</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メソッド</anchor>を呼び出していて、かつ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">子プロセス</anchor>側で
<code>AnyEvent</code> を使っていると、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ゾンビ</anchor>が残るようです。<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">子プロセス</anchor>側で<figure><pre class="code perl">$SIG{CHLD} = 'IGNORE';</pre></figure>... とすれば、回避できます。 (<code>AnyEvent</code> が <code>SIGCHLD</code>
を上書きするのが原因らしい。)</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> 
<code>eval</code> のコード内でエラーが起こると、子プロセスが死に、
次の操作で親プロセスが書き込みエラーで死にます。
<code>eval</code> の結果を親プロセスが得ることができないので次の操作を止めることができませんし、
親プロセスの書き込みエラーは <code>AnyEvent</code> イベントループからの呼び出しの中なので
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">catch</anchor> する方法もありません。
回避するには <code>eval</code> で実行するコードを <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> <code>eval</code>
で括って死なないようにするしかありません。 (エラーは <code>warn</code> など死なない方法で表示するなり、
別途 <code>run</code> などの親子で通信できる方法で親に知らせるなりするしかありません。)
<time>2017-06-05T12:17:24.800Z</time></p></body></html>