[PHP-users 15938]
Is it possible that similar coding use signal() and alarm() on C ?
Youichi Iwakiri
yiwakiri @ st.rim.or.jp
2003年 6月 13日 (金) 20:30:19 JST
いわきりです
Cで書くと簡単なんですが、signal()とalarm()を使って
SIGALRMを受ける処理と同様のことが可能でしょうか?
PHPでは、pcntl拡張モジュールを使えば何とか
なりそうなんですが、いまいち納得出来ない部分があります。
実現したいことは、特定の子プロセスをsocket_read()にし、
指定した秒数内に、データが送られてこなかった
場合に、後かたづけをして終了させるというものです。
現在は、bogus_alarm()関数を作成し、tick_functionに
登録することで誤魔化していますが、alarm()の様に
システムにインターバルを設定できないのか、肝心な関数を
見落としていないか気になっています。
set_time_limit()で終了させれば良いじゃないかというのは無しで。
共有メモリの解放、親プロセスへの各種メッセージの伝達を
行う必要があります。
下記がスクリプトの一部です。
function sig_handler($signo) {
switch($signo) {
case SIGALRM:
cleanup();
exit;
case SIGUSR1:
pcntl_signal(SIGALRM, SIG_IGN);
example();
break;
default:
break;
}
}
pcntl_signal(SIGALRM, "sig_handler");
pcntl_signal(SIGUSR1, "sig_handler");
function bogus_alarm($t = false) {
static $s_time;
if ($n)
$s_time = time();
$now = time();
if ($now - $s_time > 5)
posix_kill(posix_getpid(), SIGALRM);
}
register_tick_function("bogus_alarm");
// socketのオープン等の処理
$close_connection = false;
declare(ticks = 1) {
$is_read = false;
socket_set_nonblock($sock);
bogus_alarm(5);
while(!$is_read) {
$msg = socket_read($sock, 1024);
if (strlen($msg) > 0) {
$is_read = true;
} else if (socket_last_error($sock) != 11) {
$is_read = true;
$close_connection = true;
}
}
// 続きの処理
}
--
Youichi Iwakiri
PHP-users メーリングリストの案内