問題タブ [sysv-ipc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cygwin - Cygwin で System V セマフォを使用する: 不正なシステム コール
Cygwin での POSIX セマフォに問題があります。次のことを試しました。
上記の semtool は、(semget、semctl などの sys. 呼び出しを介して) 新しいセマフォを作成しようとします。ただし、機能しません: 不正なシステム コールです。
また、semget() を使用する最小限のテスト C プログラムは、同じメッセージを吐き出して失敗します: Bad system call.
私はグーグルをしました:cygserverをインストールし、環境変数CYGWINを「サーバー」に定義しましたが、何も役に立ちませんでした。私のバージョンの cygwin はかなり新しいものです。
まだ不足している可能性のある考え/ヒントはありますか?
追加のエクスポートで今試しました:
サービスは実行中です
もうエラーはありません:
今はうまくいくようです!
c - プロセス間のメッセージ キューの同期
プロデューサーと N (N >= 1) ワーカーを持つプログラムを実装しようとしています。これらは、メッセージ キューを使用して通信します。アイデアは、プロデューサーが「タスク」をキューに送信することです。ワーカーは msgrcv() 呼び出しを実行してタスクを取得し、コードを実行します。ワーカーがタスクを完了すると、計算の結果がキューに送信されます。プロデューサーはこのメッセージを受け取り、結果を保存します。
私は POSIX メッセージ キューを使用しており、プロデューサーとワーカーは同時に動作します。
このプログラムの背後にある問題は、通信を危険にさらすシナリオが存在することです。各メッセージのサイズは最大 5000 バイトです。UNIX システムでは、キューの最大サイズは ~16000 バイトです。
シナリオは次のとおりです。キューに 3 つのタスクがあります (5000*3 = 15000 バイト)。一部のワーカーは、キューから 1 つのメッセージを取得します (現在、キューには 10000 バイトあります)。ワーカーはタスクの実行を開始し、ワーカーが各タスクで処理する必要のあるバイト数のために、プロデューサーは別のメッセージをキューに送信します (キューは現在満杯です)。タスクが完了すると、ワーカーは結果をキューに送信しようとし、ブロックされます (キューがいっぱいです)。プロデューサーは別のタスクをキューに送信しようとし、これもブロックされます。
このプログラムを 1 人のワーカーだけで実行すると、このシナリオがかなりの確率で発生します。
この状況を回避するためのアイデアはありますか?
c - Linuxのメッセージキューの欠点は何ですか?
組み込みLinux上のプロセス間の通信に使用されるメッセージキューに取り組んでいます。Linuxが提供するメッセージキューを次のように使用しないのはなぜだろうと思います。
msgctl、msgget msgrcv、msgsnd。
共有メモリを作成する代わりに、セマフォと同期しますか?
この一連の関数をビジネス組み込み製品で直接使用することの欠点は何ですか?
c - メッセージキューからの読み取り(空の場合は非ブロッキング)
メッセージキューに書き込んでいます
と読書
しかし、このキューが空の場合はどうなりますか?それを確認する方法は?ループ内に次の命令を実行したいものがない場合
c - OpenWRT で IPC メッセージ キューのバッファを増やす必要がある
メッセージ キューの使用方法を学習しているところですが、少し問題があります。テストを行うために、2 つの完全に別個のアプリケーションを使用しています。1 つは「送信側」で、もう 1 つは「受信側」です。
送信者を実行すると、15 個の文字列がパイプに送信されますが、その後、「リソースが一時的に利用できません」というエラーで失敗します。受信者側でメッセージを消費する必要があるだけですが、なぜ15メッセージしかないのですか? 大量のメッセージを送信する可能性があるため、これをもっと大きな数、たとえば 1000 程度に増やしたいと考えています。
メッセージ キューのサイズを 32767 に設定しようとしたので、少なくとも 31 になると予想していましたmsg_qbytes
が、バッファできるメッセージの数とは関係ないようです。
送信者コードは次のようになります。
受信コードは次のようになります。
c - メッセージ キューを読み取るプロセスに EOF を送信する方法はありますか?
を使用してメッセージキューを介してデータを送信するプロセスが 1 つありますmsgsnd
。でキューから読み取る別のプロセスmsgrcv
。読み取りプロセスは、続行する前にすべてのメッセージを受信するまで待機する必要があります。すべてのメッセージが送信されたことをどのように伝えることができますか?
私が行ってきた方法は、送信者がすべてのメッセージを送信した後、while ループでキュー内のメッセージの数をチェックすることです。メッセージがなくなると、キューを閉じます。
これは、読み取りプロセスに他のことを続けるように指示します。ただし、これはあまり信頼できないようです。多くの場合、送信プロセスはキューのステータスをチェックする無限ループに陥ります。
EOF メッセージを送信して、読み取りプロセスにそれを監視させる方法はありますか? 次に、EOF を送信して、送信プロセスを終了させることができます。
c - 文字列を key_t に変換する
key_t
を使用して共有メモリセグメントを作成するために使用するために、文字列を に変換するにはどうすればよいshmget
ですか?
これは、共有メモリをマッピングするためのキーが TCP/IP 経由で送信されているためです。
前もって感謝します!
ipc - Mac サンドボックスで ipc-sysv-sem を有効にする方法は?
Mac アプリケーションで IPC System V セマフォ (ipc-sysv-sem) を使用する必要があります。ただし、Mac サンドボックスでは使用できません。私は(Macコンソールで)取得します:
MacサンドボックスアプリケーションでIPC System Vセマフォを受け入れる方法はありますか?
どうもありがとう!
c - System V セマフォの複数のインクリメント/デクリメント
私は POSIX セマフォと System V セマフォの違いを読んでいて、同じことに関するいくつかの記事を読みました。各記事には、次のように書かれています。
私の質問は次のとおりです。
1) 単一のアトミック操作で複数のインクリメント/デクリメントが必要なのは何ですか? 例を挙げて説明していただけますか?
2) semop で値を -1 未満および +1 より大きい値に変更できるのはなぜですか? 同じものの実用的な使用法/例はありますか?
(System V セマフォの semop() 関数を使用すると、セマフォ配列内の複数のセマフォに対して、指定された値だけセマフォを増減させることができます。 POSIX セマフォ. しかし、同じの使用は何ですか?)
参考までに読んだ記事:
1) http://www.ibm.com/developerworks/library/l-semaphore/
3) http://www.linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html?page=4
4) http://linuxtips.pbworks.com/w/page/29023300/SystemV%20vs%20Posix%20IPC
アップデート:
semop() を使用したセマフォの複数のインクリメント/デクリメントについて言及している以下の記事を読みましたが、同じ例/実際の使用法をまだ取得できません。参照用の記事:
1) http://kaharris.org/teaching/51081/Assignments/Final/systemV.pdf
記事からの抜粋: (「複数のセマフォ操作の例」というタイトルの下)
「System V セマフォの威力は、1 回の操作で複数のセマフォをアトミックにチェックおよび設定できることです。」
彼はそれを行う方法の小さなスニペットも提供しました。しかし、同じものの実際の使用法はありません。
2) http://www.anirudhtom.com/2011/02/system-v-semaphores-for-babies.html
著者は、「セマフォのセットの実装」というタイトルで、アトミック操作でセマフォの複数のインクリメント/デクリメントのコードを作成しました。同じものの実際の使用法は、ここでもまだ言及されていません。
本からの抜粋:
「UNIX System V では、セマフォ メカニズムがある程度の調整を行います。操作の原子性は維持されます。ただし、操作の加算値または減算値は 1 よりも大きくなる可能性があります。(なぜ? 何に使うのでしょうか?) さらに、プロセスは複数のセマフォを実行できます。複数のプロセスが多数の異なるリソースを同時に競合する場合のデッドロックの問題を回避するために、操作を同時に実行します。(どのように?例?)"
質問がより明確になることを願っています。
質問された内容に疑問がある場合はコメントしてください。
前もって感謝します!
c - POSIX セマフォの Sys V SEM_UNDO と同等
複数のプロセスを持つ Linux システムでは、システム V セマフォは SEM_UNDO のオプションを許可し、セマフォを保持しているプロセスがクラッシュした場合にセマフォが「スタック」するのを防ぎます。セマフォを保持しているプロセスでのクラッシュの結果として POSIX セマフォが詰まるのを防ぐ正しい方法は何ですか? それとも、POSIXは、クラッシュの場合にセマフォが解放されることを保証しますか?