• 締切済み

セマフォの使い方

マルチプロセスで1つのファイルのwrite/readに、 セマフォを使用したいと思います。 色々と載っているのですが、セマフォの書き方がいまいちよくわかりません。 どなたか簡単にプログラミングを教えて頂けませんでしょうか。

みんなの回答

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.3

直前の質問でSIGTERMについて聞いているので、UNIX系かCygwinなどの環境かと思います。 セマフォを使うまでもなく、flock(2)で十分では?

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/flock.2.html
  • floor101
  • ベストアンサー率28% (2/7)
回答No.2

単純なファイルの排他動作であれば、semaphoreの代わりにmutexを使えば十分な気がします。 semaphoreは、バッファの書き込みルーチンと、読み取りルーチンが別々のプロセスもしくはスレッドで動いているような場合、バッファのオーバーフローを防止するために、mutexにはないカウント値を使用できます。 通常、ファイルを単純に排他処理すると、使用目的にもよりますが、パフォーマンスが大幅に落ちてしまいますので、ファイルのロックを使用します。 LockFile系、LockFileEx系APIがそれに当たります。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

こちらのサイトにセマフォに関するプログラミングの例がありますので、参考にしてください。

参考URL:
http://www.ncad.co.jp/~komata/c-frame.htm

関連するQ&A

  • セマフォについて

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

  • セマフォと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); }

  • セマフォの使用例を教えてください。

    こんにちは。COPY_ROBOT4です。 現在、VCのセマフォの使用例を今探しています。MSDNを見たのですが、文章で書いてあるだけで、実際どのように書いたらいいのか分かりません。どうか知っている知識を少し分けてください。 【セマフォをどのように使いたいか】 データ書き込み中、読み込み中にも関わらず、またデータ書き込み、読み込みをしないように、最中はロックをしたいと考えています。 この場合、どうすればいいですか?どうか使用例を教えて下さい。 また、お勧めサイトがあったら是非教えて下さい。 何もかも、聞いてしまって申し訳ないです。お願いします。

  • セマフォが

    初めて投稿するのですが 分かる方教えて下さい Windows 2000環境に新しくHDDを増設してフォーマットまで済ませたのですが、 このディスク(E:\)に別のドライブ(F:\)からファイルを書き込もうとすると、 「ファイルまたはフォルダのコピーエラー**********(ファイル名)をコピーでき ません。パス名が長すぎます。」というウインドウと 「ファイル \Device\HarddiskVolume4\DOWN\**********(ファイル名)の ためのデータを一部保存できませんでした。データを損失しました。このエラー は、コンピュータのハードウェアまたはネットワーク接続の障害によって発生した可能性があります。このファイルをどこか別の所に保存してください。」と出てコ ピーできません。 そこで別のWindows XPマシンにこの2ドライブを繋げてコピーすると出来てしまう のです。 2000環境のせいかと思ってコピーし終えたドライブを元に戻し、コピーされたファ イル(ムービーファイルなのですが)を再生しようとすると、今度は「セマフォがタイムアウトしました」と出て止まってしまいます。 原因が2000マシンにあるのは明白なのですが、なにが元でトラブっているのか さっぱりわかりません。 どなたか対処法を教えて下さい。よろしくお願いします 

  • linuxのセマフォに関する質問です

    1回upしたセマフォXを、downせずにそのupを無かったことにしたいのですが、この場合、sema_init(&X,0)を実行すれば問題無いでしょうか?(これでまた初期状態から正常にXが使用できるようになるでしょうか?)

  • 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); } }

  • grep でパラレル検索するには

    あるディレクトリいかに置かれているソースコードの中で特定のパターン (文字列) を含むファイルの一覧を取得するのに grep を使って検索してい るのですが、もう少しよい方法がないかと試行錯誤しています。 [現行法] find . -type f | \ while read line; grep -qP pattern "$line" && echo $line; done そこで、使用しているサーバのCPU 数が8であることに目を付け、マルチ プロセスもしくはマルチスレッドの仕組みを用いて8多重でgrepを実行で きる仕組みを考えています。 最初に考えたのは以下のような方法です。 ・pthread を利用する。 ・各レッドで system 関数を使用して grep を実行する。 ・子プロセスは標準入力をパイプから受け取るようにする。 ・検索対象となるファイル一覧の読み込みは mutex を用いて制御する。 →system 関数はシェル経由で grep をコールするようで、オーバーヘッド が気になるなどの理由により却下。 次に考えたのは以下のような方法です。 ・pthread を利用する。 ・各スレッドで fork し、子プロセスで grep を実行する (exec)。 ・子プロセスは標準入力をパイプから受け取るようにする。 ・検索対象となるファイル一覧の読み込みは mutex を用いて制御する。 →デッドロックの問題が解決できずに断念。 pthread で fork を使う場合は直ぐに exec するようにしないとデッド ロックする可能性があるという記事をネット上で見つけました (標準入力 をパイプから受け取るようにする処理があるため直ぐには exec できな い)。で、実際にもそのようになってしまいました。 そして、最終的に考えているのが以下のような方法です。 ・fork を利用する。 ・各プロセスでさらに fork し、孫プロセスで grep を実行する (exec)。 ・孫プロセスは標準入力をパイプから受け取るようにする。 ・検索対象となるファイル一覧の読み込みはセマフォを用いて制御する。 でも、本当にこのようにマルチプロセス+セマフォを使う方法でしか 「grep でパラレル検索」を実現することはできないのでしょうか? pthread で実現することには失敗してしまいましたが、もう少し改良して 成功できないかと考えているのですが・・・。 (かと言って、あちこち mutex でロックしてしまうと、せっかくのスレッ ドが生かされない?)

  • C言語でチャットプログラミングを・・・

    C言語(unix環境)でチャットプログラミングを作りたいのですが、まずは、TCP/IPによるマルチクライアントで簡単なメッセージのやりとりができるプログラムを練習として作りたいと考えています。 そこでサーバにクライアントからメッセージが届いた時点で全クライアントにメッセージを送信(write)し、逐次更新されるようにしたいのですが、クライアント側で常にread関数を呼び出すのは非常に不格好だし、メッセージを入力するといった他の処理ができなくなると思うのです。 何か方法はありますでしょうか? なにぶんネットワークプログラミングは始めたばかりですので初心者向けの解説をお願いします。

  • バックアップしようと・・・

    バックアップと復元センターを使ってバックアップしたんですが エラーでて、できません。(プロセスは、ファイルにアクセスできません、別のプロセスが使用中です)とでて、 0X80070020 が出てきます でも完成ではないけど、一部のファイルが書き込まれています。 OSはVista です。外付のスーパーマルチドライブ使用 やはり、HDDでの作業のほうがいいですかね~ どなたかアドバイスお願いします。

専門家に質問してみよう