GNU/Linux >> Linux の 問題 >  >> Linux

Linux でシグナルを使用した IPC

シグナルは、IPC メカニズムとしてではなく、プロセスに対する制御の基本的な形式を提供することを目的としています。シグナルを他のものとして使用する場合、シグナルにはいくつかの問題があります:

  • 多くのシステム コールはシグナルによって中断され、特別な処理が必要になります。

  • したがって、実際のコードの多くはシグナルセーフではありません。

  • 信号には、それ自体を除いて、いかなる種類のデータ コンテンツもありません。これにより、メッセージの受け渡し方法としてほとんど役に立たなくなります。

  • シグナル ハンドラでできることは限られています。

  • 最も重要なことは、同じタイプの後続のシグナルはキューに入れられず、マージ されることです。

  • さらに重要なのは、シグナルが生成されたのと同じ順序で配信されるという保証はない .マニュアルページから:

    <ブロック引用>

    対照的に、プロセスに対して複数の標準シグナルが保留中の場合、それらが配信される順序は指定されていません。 .

理論的には いくつかの信号が行き来することを使用して、ある種のチャネルを設定できます。いくつかはある種の確認応答のように機能しますが、正気な人はそのようなことを試みたくありません.代わりに煙信号を使用することもできます...


<ブロック引用>

シグナルキャッチとシグナルレイズを使ってIPC(プロセス間通信)を行うことは可能ですか?

はいといいえ。シグナルだけを考えると、別のプロセスにシグナルを送ることはできますが、シグナル以外のものを送ることはできません。

<ブロック引用>

このシグナルでもメッセージを渡したいです。私はそれを行うことができますか?可能ですか?

いいえ、あなたがしようとしている方法ではありません。これを行うには、ソケット、ファイル、パイプ、または名前付きパイプを使用できます。 UNIX IPC について詳しく知りたい場合は、UNIX 環境での高度なプログラミングをお読みください。


いいえ、これに信号を使用しようとしないでください。 siginfo 構造体以外のシグナルに余分なデータを添付することはできません。ただし、シグナルを使用する際の主な問題は、シグナルセーフがほとんどないことです。ほぼすべての C ランタイム ルーチンを回避し、受信プログラムがすべてのカーネル呼び出しで EINTR チェックを行うようにする必要があります。信号が発生したときに言えることは、期待したときに発生しないということだけです (スペインの異端審問のようなものです)。

共有メモリ、メッセージ キュー、FIFO (名前付きパイプ)、ソケットなど、他の IPC メカニズムを調べることをお勧めします。


Linux
  1. Linuxでのripgrep(rg)コマンドの使用

  2. Linux Deploy を使用した Android 上の Kali Linux

  3. Linux での dmsetup コマンドの使用例

  1. Linux カーネルで getnstimeofday を使用する例

  2. mv コマンドを使用して Linux でフォルダーを移動する

  3. UNIX/Linux シグナル処理:SIGEV_THREAD

  1. ProcDumpを使用してLinuxをデバッグする

  2. signalfd() がシグナルを見逃す

  3. 信号を無視 (失わ) できますか?