プロが教えるわが家の防犯対策術!

UNIXの装置内で、複数プロセスからの同時アクセス
を排他する為にセマフォを使用するのですが、聞いた所
によると、セマフォを使用してロック中のプロセスが異
常終了した場合は、そのセマフォでロックした状態から
開放されないと聞きました。systmemVはロックしたまま
で、posixは色々制御出来るかも・・・。と聞きました。
ロックを解除する方法があるものでしょうか?。又、そ
のロックを解除する方法について、何らかの情報を教え
て頂けますでしょうか?。

A 回答 (1件)

> セマフォを使用してロック中のプロセスが異常終了した場合は、そのセマフォで


> ロックした状態から開放されないと聞きました

この文面からすると、ロックした状態(というのは正確な表現ではありませんが)を
誰も解除できなくなってしまうんじゃないか、と思っているということですね。

そんなことはないですよ。

少なくとも、そのセマフォに対して書き込み権限があるプロセスからは自由に操作す
ることができます。そうじゃなくては、プロセス間通信の意味が無いですもんね。

どんな unix を使っているかにもよるとは思いますが、あるプロセスが行った
セマフォの操作を元に戻すやり方として、以下の三つを思い付きます。

・semop() するときに SEM_UNDO を指定する

このフラグを立ててセマフォを操作すると、そのプロセスが終了したときに、
セマフォの状態が元に戻ります。資源の排他なんかにセマフォを使うには、これで
十分だと思いますが、値を増やす操作と減らす操作を別プロセスにしたいような
場合には使えません。

・初期状態に戻すようなプログラムを作っておく

先程書いたように、そのセマフォへの書き込み権限があるプロセスからは操作が
可能なので、初期状態に戻すプログラムを作っておけば、セマフォのことを
あまり知らないユーザでも、異常な状態を戻すことができます。

・セマフォ自体を削除する

もし、セマフォ自体を削除してもいいのであれば、ipcrm というコマンドがある
はずなので、それを使ってセマフォ自体を削除してしまいましょう。何も用意しな
くても良いのが、このやり方のメリットですね。


> 何らかの情報を教えて頂けますでしょうか?

まずは、マニュアルを見ましょう。ある程度、unix やプログラムの知識が無いと
厳しいですが、man ページの semop、semget、semctl、ipcrm、ipcs といった
ところを読むと良いと思います。
    • good
    • 0
この回答へのお礼

大変有難う御座います。すぐにsemop()関数を調べ
プロトで試してみます。

お礼日時:2001/07/19 15:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!