Jun 18, 2010

PHP sem_ acquire sem_ get sem_ release sem_ remove チョット詳しいメモ

PHP sem_acquire sem_get sem_release sem_remove チョット詳しいメモ

---------------------------------------------------------------------
sem_acquire
マニュアル http://jp.php.net/manual/ja/function.sem-acquire.php
---------------------------------------------------------------------

■詳しい説明

sem_acquire() は、(必要な場合) セマフォが確保できるまでブロックします。
既に確保されているセマフォを得ようとするプロセスは、 セマフォの獲得により
 sem_get()で指定した max_aquire 値を超える場合、 永久にブロックされます。

---------------------------------------------------------------------
sem_get
マニュアル http://jp.php.net/manual/ja/function.sem-get.php
---------------------------------------------------------------------
説明とパラメータの改善

■詳しい説明

sem_get() は、 System V セマフォを指定したキーで
アクセスするために使用可能な ID (例: "Resource id #1")を返します。

同じキーで sem_get() を 2 度コールした場合、 別のセマフォ ID
 (例: "Resource id #2")が返されます。
 しかし、どちらの ID も同じそのセマフォをアクセスします。

セマフォは、sem_ remove()するまで、OS上に残ります。

■詳しいパラメータ

□key

例: "123456"。
Linux の場合、 "cat /proc/sysvipc/sem" コマンドで、
key の一覧を見ることができます。
"cat /proc/sysvipc/sem" コマンドの "semid" と
この関数が返すセマフォ ID は、関係ありません。

□max_acquire

sem_ acquire()により、同時にセマフォを得ることが可能なプロセス数を
max_acquire にセットします。

つまり同時に1プロセスだけがアクセスできるよう排他制御したいときは、
max_acquire を1にします。

□perm

セマフォのパーミッション。 実際には、この値はプロセスが現在その
セマフォに付随している 唯一のプロセスであることがわかった場合にのみ
セットされます。

Linux の場合、 "cat /proc/sysvipc/sem" コマンドで、
keyとpermの一覧とを見ることができます。

□auto_release

リクエストの終了時に自動的にセマフォを開放するかどうかを指定します。

---------------------------------------------------------------------
sem_release
---------------------------------------------------------------------

(補足ありません)

---------------------------------------------------------------------
sem_remove
マニュアル http://jp.php.net/manual/ja/function.sem-remove.php
---------------------------------------------------------------------
説明の改善

■詳しい説明

sem_remove() は、指定したセマフォを削除します。

セマフォを削除した後、そのセマフォにはもうアクセスできません。

補足すれば、あるプロセスで、あるセマフォを削除した後、他のプロセスで
そのセマフォを利用する、sem_ acquire(), sem_ get(), sem_ release()が
Warningとなります。

Linux の場合、 "cat /proc/sysvipc/sem" コマンドで、
key の削除を確認できます。

phpのコードで sem_remove() を使う必要性はまずありません。

---------------------------------------------------------------------
コード例
---------------------------------------------------------------------

$seg = sem_get("423456", 1, 0666, 1) ;
if($seg !== false){
        echo date("c")." seg:".$seg."\n";
        $seg2 = sem_get("423456", 1, 0666, 1) ;
        if($seg2 !== false){
                echo date("c")." seg2:".$seg2."\n";
        }
        echo date("c")." sem_acquire\n";
        sem_acquire($seg);
        echo date("c")." sleep\n";
        sleep(5);
        echo date("c")." sem_release\n";
        sem_release($seg);
        //sem_remove($seg);
}
?>