[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 メーリングリストの案内