スポンサーリンク

Unixのシステムは、子プロセスが死んだときに、シグナル SIGCHLDを
受け取ることが可能です。
C言語だとsignal(3)を使って、SIGCHLDを受け取るハンドラをセットします。

perlの場合は、$SIGのCHLDにハンドラを設定し、SIGCHLDを受け取ることができます。

サンプルコード

fork()で子プロセスを生成し、親プロセスはsleepします。
子プロセスは1秒間のsleepをして、終了します。
親プロセスは、sleep(30)で30秒間 sleepするはずですが、シグナル SIGCHLDを受信すると、直ちにsignalでセットしたハンドラを呼び出され、シグナルのハンドラが終了するとsleepから復帰し、sleepの次のプログラムが実行されます。よって、親プロセスも1秒程度しかsleepしない結果になります。

#!/usr/local/bin/perl -w
use strict;

use POSIX ":sys_wait_h";

sub sigchld
{
	my ($sig) = @_;
	print $sig, "\n";
} 

sub forker 
{
	my $pid = fork();
	if ($pid == 0) {
		sleep(1);
		exit;
	}
}

sub main
{

	$SIG{CHLD} = 'sigchld';
	forker;

	sleep(30);
	print "sleep done\n";

	while ( (my $waitpid = waitpid(-1, &WNOHANG) ) > -1 ) {
		print "$waitpid\n";
	}

	exit (0);
}

& main;

関連
[2007-07-07-1] perl signal SIGCHLDを受け取る
[2008-07-06-2] perl シグナルでプロセスを中断と再開する方法
参照しているページ (サイト内): [2009-04-27-1] [2008-08-25-1] [2008-08-24-2] [2008-08-24-1] [2008-07-06-2]

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー