2

私はこれらの使用法を理解していません:msleepそしてmsleep_interruptible...私は一方が中断可能でもう一方が中断不可能であることを知っていますが、実際に見ることができる特定の使用法を見つけることができませんでした。関数を使用してスレッドを呼び出してmsleepを実行し、「Hello!」と出力してみました。その後、msleep(msleep_interruptible)になりましたが、違いはわかりませんでした。誰かがそれで私を助けることができますか、例であるかもしれませんか?

4

1 に答える 1

5

違いは、シグナル (SIGINT など) が発生し、そのシグナルのシグナル ハンドラーを設定したときに何が起こるかです。

  • msleep眠りに戻る
  • msleep_interruptible呼び出し元に戻ります (残りのスリープ時間を表すゼロ以外の値)。

中断可能なスリープの例:

$ perl -Mthreads -E'
   my $stime=time;
   async { sleep(3); kill INT => $$; }->detach();
   $SIG{INT} = sub { warn "Got INT signal after ".(time-$stime)."\n"; };
   sleep(5);
   say time-$stime;
'
Got INT signal after 3
3

処理されたシグナルによって中断されたため、5 秒ではなく 3 秒間スリープしていました。他のバージョンでは、次のように出力されます。

Got INT signal after 3
5

つまり、どちらの方法でもシグナル ハンドラーが呼び出されますが、一方のバージョンはシグナルが来ても返されません。

于 2012-06-18T21:49:55.327 に答える