• 締切済み

セマフォについて

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

みんなの回答

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

> セマフォを使用してロック中のプロセスが異常終了した場合は、そのセマフォで > ロックした状態から開放されないと聞きました この文面からすると、ロックした状態(というのは正確な表現ではありませんが)を 誰も解除できなくなってしまうんじゃないか、と思っているということですね。 そんなことはないですよ。 少なくとも、そのセマフォに対して書き込み権限があるプロセスからは自由に操作す ることができます。そうじゃなくては、プロセス間通信の意味が無いですもんね。 どんな unix を使っているかにもよるとは思いますが、あるプロセスが行った セマフォの操作を元に戻すやり方として、以下の三つを思い付きます。 ・semop() するときに SEM_UNDO を指定する このフラグを立ててセマフォを操作すると、そのプロセスが終了したときに、 セマフォの状態が元に戻ります。資源の排他なんかにセマフォを使うには、これで 十分だと思いますが、値を増やす操作と減らす操作を別プロセスにしたいような 場合には使えません。 ・初期状態に戻すようなプログラムを作っておく 先程書いたように、そのセマフォへの書き込み権限があるプロセスからは操作が 可能なので、初期状態に戻すプログラムを作っておけば、セマフォのことを あまり知らないユーザでも、異常な状態を戻すことができます。 ・セマフォ自体を削除する もし、セマフォ自体を削除してもいいのであれば、ipcrm というコマンドがある はずなので、それを使ってセマフォ自体を削除してしまいましょう。何も用意しな くても良いのが、このやり方のメリットですね。 > 何らかの情報を教えて頂けますでしょうか? まずは、マニュアルを見ましょう。ある程度、unix やプログラムの知識が無いと 厳しいですが、man ページの semop、semget、semctl、ipcrm、ipcs といった ところを読むと良いと思います。

ssktoshi
質問者

お礼

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

関連するQ&A

  • セマフォとmutexの違いは?

    排他制御としてセマフォとmutexがありますが、 この二つの違いがよくわかりません。 自分で調べてみたところ、 ・セマフォ…プロセス間排他制御。複数ロックがかけられる。 ・mutex…スレッド間排他制御。ロックは一つだけ。 と言うような違いがあるようなのですが、これだけの差なんでしょうか? (これだけの差、と言ってる時点で筋違いだったら申し訳ありません) また、セマフォをスレッド間排他制御に用いたり、 mutexをプロセス間排他制御に用いることは可能なのでしょうか? 可能だとしたら、これらが2種類存在する理由も教えていただきたいです。

  • 【C++】セマフォとプロセスの使い方

    【C++】セマフォとプロセスの使い方 WindowsXPでVC++2008コンパイラを使用して、 プロセスとセマフォについて勉強しています。 外部プログラム(今回は電卓として)を5つ立ち上げるのですが、 同時に立ち上げるのは2つまでとしたい場合、どのように組むのでしょうか。 http://nienie.com/~masapico/api_CreateSemaphore.html こちらにスレッドを使用したセマフォを使ったサンプルがあるのでが、 プロセスを使うとなると、うまく書けません。 ご指導頂けませんでしょうか。 ===現在まで書いたソース=== (5つのプロセスをつくるループも実装していませんが、、、) #include<windows.h> #include<stdio.h> #include<tchar.h> HANDLE g_hSemaphre; void main(){ BOOL bRet; STARTUPINFO si; PROCESS_INFORMATION pi; //Semaphoreオブジェクト g_hSemaphre = CreateSemaphore(NULL,2,2,NULL); bRet = CreateProcess(_T("C:\\WINDOWS\\system32\\calc.exe"), _T(""), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); //プロセス終了 WaitForSingleObject(pi.hProcess,INFINITE); //後処理(プロセス開放) ReleaseSemaphore(g_hSemaphre,1,NULL); //スレッドとプロセスを閉じる。 CloseHandle(pi.hThread); CloseHandle(pi.hProcess); //Semaphoreオブジェクト CloseHandle(g_hSemaphre); }

  • 共有メモリの同時アクセスについて教えてください。

    2つのプロセスが同時に同じ共有メモリにアクセスすることは可能ですか? ミューテックスや、セマフォなどの排他制御を外せばできたりしませんか? 片方のプロセスで共有メモリから、データの一部をHDDに保存しつつ、それと同時に、もう片方のプロセスで共有メモリからデータの中身を表示させたいのですが・・・。

  • セマフォとスレッドの問題について

    この問題は東京大学大学院の問題なのですが、問題の求めているものがよくわかりません。 セマフォとスレッドなどは勉強して理解しているのですがこの問題はどのようにして解くのでしょうか? 8つのスレッドT1,T2,・・・,T8がある。それぞれのスレッドTiはステートメントSi()を実行するが、Sj()に関連付けされたセマフォSjのオペレーションP(Sj),V(Sj)などを利用して同期・排他制御を行う。(i,j=1,・・・,8)。ステートメントSi間の実行順序に添付した図のような依存性がある場合、それぞれのスレッドTiが実装する同期方法をSi(),P(Sj),V(Sj)などを用いて説明せよ(i,j=1,・・・,8)。 例えば、S1()はS2()とS3()より前に実行する必要があるが、S2()とS3()は同時実行可能である。また、S7()はS4()とS5()が終了しないと実行できない。全てのセマフォは初期化されていると仮定してよい。

  • Linuxのgccでセマフォをやりたい。

    gccプログラムでマルチタスクのプログラミングをやっています。 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2433/trunk/20140411/main.c 以前、H8マイコンに組み込みOSを使用した際に、複数のタスクを動作させている際に、各タスクがwhile(1)で永久ループの状態をしている際に、その永久ループを一時停止するためのロック・アンロック専用のタスクを1つ作って、各タスクのロック・アンロックして動作を制御することをやったことがありました。 確かロックの場合はSempend();というので、アンロックというのはSempost();という物だったと思いました。 例えばTASK1,TASK2,TASK3という3つのタスクを作成し、それぞれを制御したい場合は、 例えばTASK1のセマフォをアンロックしたい場合は Sempost(LockTask1); このようにしたらTASK1が動作し始め、ロックしたい場合はSempend(LockTask1);というようにしたいと思います。 次の例のようなセマフォ制御をLinuxのgccのセマフォプログラミングで行うことは可能でしょうか? どうぞ、ご教示頂きますようお願い致します。 (例) //タスクセマフォ制御用タスク TASK_SEM_CTL() { while(1) { Sempost(LockTask1); delay(1000) //1sec wait Sempost(LockTask2); delay(1000) //1sec wait Sempost(LockTask3); delay(1000) //1sec wait } } TASK1 { while(1) { Sempend(LockTask1); printf("TASK1_done"); Sempost(LockTask1); } } TASK2 { while(1) { Sempend(LockTask2); printf("TASK2_done"); Sempost(LockTask2); } } TASK3 { while(1) { Sempend(LockTask3); printf("TASK3_done"); Sempost(LockTask3); } }

  • Accessでの排他制御

    アクセスの排他制御に関して質問です。 ネットワーク上のサーバーにアクセスのMDBを置いて、複数の人が更新目的で開く場合、排他制御はどうなるのでしょうか? テーブル単位で、ロックが掛かるのでしょうか? もしそうであれば、複数の人が同時に使えないのですが、回避策はありませんでしょうか?

  • 排他制御。

    現在ASPで作成しているプロジェクトでは ページが三つあります。 1ページ目でデータを選択し、排他をかける。 2ページ目でデータを更新して、 3ページ目で排他を解除しています。 この際2ページ目でページを閉じられた場合、 排他を解除しなくてはならないのですが なにかいい方法はありませんか? また、ブラウザの戻るボタンを押されたときにも 排他を制御しなくてはなりません。 なにか判断する方法はないでしょうか?

  • マルチスレッド環境での配列使用について

    現在、C++を利用してマルチスレッド環境の開発を行っています。 マルチスレッドで排他的に変数を扱う場合、クリティカルセクションや ミューテックスを使用することで、排他制御をおこなうことができますが、 このように、配列の要素ごとに排他制御を行うことは可能でしょうか? たとえば、 int ary[10]; のような配列があれば、a[0]~a[9]まで要素をそれぞれ排他制御によって データの矛盾を避けたいと考えています。 パフォーマンスの関係上、できるだけ、配列全体をロックするのは避けたいと 思っています。 どうぞよろしくお願いします。

  • POSIXメッセージとは?

    こんにちわ。 私はSolaris8のC++でプログラミングをしている中級者です。 プロセス間通信の方法として、メッセージキューを使っています。 具体的には、キュー作成(msgget)、送信(msgsnd)、受信(msgrcv)、削除(msgctl)等の関数を使っているのですが、これ以外に「POSIXメッセージ」とかいうメッセージがあると聞きました。 SUNのドキュメントで調べてみたのですが、POSIXとは"Potal Operating System Interface for UNIX"で、まあUNIXベースのOSならみんな使えるような関数と解釈しました。この解釈は正しいでしょうか? そして、私が使用しているmsgXXX関数とどのように違って、どのような利点があるのでしょうか? 具体的には、上記のmsgXXXを実現するために、mq_open(), mq_close, mq_send, mq_receiveを使えば良いというだけのことなのでしょうか? POSIXメッセージとは、何か?また、こうやって使うんだよというような参考になるURLをご存じの方がいらっしゃいましたら、教えてくださいませ。

  • 排他制御について

    普段は排他制御として閲覧のみOKにしています。 最近、txtファイルをメモ帳で修正されてしまう事件が 連続2件発生してしまいました。 つまり排他制御をかけているソフトが終了したため、 ロックが解除されて、その後にメモ帳で上書きされてしまいました。 このため、閲覧も禁止にしたところ、不便だと文句が出ました。 メモ帳は原則禁止にすべきと考えていますが、 皆様はどう思われるでしょう。そこまで厳しくしなくてもいいのでしょうか。

専門家に質問してみよう