ミスティーネットPerl・CGI講座 パール・CGIレッスン MISTY-NETレンタルサーバー・PERLプログラミング講座 CGI&PERL究極のレシピ
| HOME | ご利用について | 推奨環境 | リンクに関して | 免責/規約 | お問合せ | ミスティーネット | リンク集 |
Perl言語リファレンス

ミスティーネットPerl・CGI講座/基本編
ミスティーネットPerl・CGI講座/基本編
始めに 始めに
変数について 変数について
処理の制御1 処理の制御1
処理の制御2 処理の制御2
配列の処理 配列の処理
ハッシュの処理 ハッシュの処理
数値の扱い 数値の扱い
文字の扱い 文字の扱い
時間の処理 時間の処理
サブルーチン サブルーチン
ファイルの処理 ファイルの処理
ディレクトリの処理 ディレクトリ処理
CGIについて CGIについて
漢字の処理 漢字の処理
    (文字コード)
Cookie の処理 Cookie の処理
正規阜サ1 正規阜サ1
正規阜サ2 正規阜サ2
演算子について 演算子について
ライブラリ ライブラリ
デバッグ デバック
環境変数について 環境変数
ミスティーネットPerl・CGI講座/基本編

ミスティーネットPerl・CGI講座/応用編
ミスティーネットPerl・CGI講座/応用編
カウンターを作ってみよう カウンターを
     作ってみよう!
ミニゲームを作ってみよう ミニゲームを
     作ってみよう!
ミスティーネットPerl・CGI講座/応用編

  HOME >> アルファベットで関数を検索 >> semop
semop [SYSTEMV IPCのsemctl システムコールを実行し、セマフォを操作する]
[関数の使い方・書式]

semop ,

(スカラー) セマフォID。 ・・・ semget などで得たID。存在しないとエラー。
(スカラー) 操作コマンド。 ・・・ semop構造体にパックされたコマンド。
(スカラー) 成功時は真(1)、エラー時は偽(未定義値)を返します。


[関数の機能]
セマフォの取得や解放などの操作を行ないます。
操作コマンドとなる semop構造体は次のようにして作成します。

$opstring = pack("s*", $num, $op, $flag);

一つのセマフォIDで複数のセマフォを作成した場合は、packの引数の $num には操作の対象となるセマフォ番号を指定します。 但し、1番目のセマフォは0で指定します。$op にセットする値とセマフォの操作の金木は次のようになります。

$op セマフォの値 操作
< 0 >= abs($op) セマフォの値から abs($op) を減算。
< 0 <= abs($op) セマフォの値 >= abs($op) となるまでブロックされる。 このときセマフォの値は abs($op) 分減算される。
== 0 == 0 システムコールは直ちに戻る。
== 0 != 0 呼び出した側のプロセスは、セマフォの値 == 0 となるまでブロックする。
> 0 $op の値がセマフォの値に加算される。

abs() は絶対値を表しています。
フラグには &IPC_NOWAIT と &SEM_UNDO が指定できます。 なお、コマンドの個数は $opstring の長さによって判別されます。
プラットフォームで SYSTEMV IPC がサポートされている必要があります。 エラー発生時には、$! にエラーコードがセットされます。


[書式の例]
semop($id, $opstring);


サンプルソース
● セマフォ値が0になるまで待機し、獲得時セマフォ値を増数してメッセージを出力
require "sys/ipc.ph";
require "sys/msg.ph";
$| = 1;

# セマフォIDを取得する
$id = shift;
unless (defined $id) { die "Usage: $0 SemphoreID\n"; }
$semnum = 0;
# セマフォが0になるまで待機
$opstring1 = pack("sss", $num, 0, 0);
# セマフォの値を増数
$opstring2 = pack("sss", $num, 1, 0);
$opstringA = $opstring1 . $opstring2;
semop($id, $opstring) || die "Semaphore trouble: $!\n";
print "処理完了\n";


● セマフォ値が1になるまで待機し、獲得時セマフォ値を増数してメッセージを出力
# セマフォIDを取得する
$id = shift;
die "Usage: $0 SemphoreID\n" unless defined($id);
$semnum = 0;
# セマフォの値を増数
$opstringB = pack("sss", $semnum, -1, 0);
semop($id, $opstringB) || die "Semaphore trouble: $!\n";
print "セマフォ獲得\n";



| HOME | ご利用について | 推奨環境 | リンクに関して | 免責/規約 | お問い合わせ | ミスティーネット |
(C)Copyright 2002 ミスティーネット Inc. All Right Reserved.