/ / Cのパイプライン-フォークを使用する必要がありますか? -c、Linux、プロセス、パイプ、プロセス間通信

Cのパイプライン - フォークを使用する必要がありますか? - c、linux、プロセス、パイプ、プロセス間通信

Linux環境でCのみで作業していると仮定しましょう。

通常、pipe()関数を使用する場合は、パイプを作成してからフォークします。これにより、親が子と通信できるようになり、その逆も可能です。

しかし、それが親子ではない場合はどうでしょうか? 「実行中の古いプロセスがある場合、pipe()関数を使用して通信できますか?このプロセスは現在のプロセスの親ではありません(または何らかの形で関連しています)が、あります」 pid。プロセス間通信のファイルまたはソケットに制限されていますか?

ソケットを使用せずにpidを指定し、そこから情報を受け取る方法はありますか?

回答:

回答№1は1

あなたの質問について

しかし、それが親子ではない場合はどうなりますか?古いプロセスがある場合 それは実行中です。pipe()を使用して通信できますか 関数?

親プロセスによって作成されていない他のプロセスと通信することはできません。技術的には、許可されません。

この機能を実現するには、OSを使用するか、他のIPCメカニズムを使用する必要があります。

データベースは、この主な理由だけで広く使用されています。複数のプロセスが単一のDBに対してデータを読み書きできます。複数の更新からの保護。


回答№2の場合は1

または使用する FIFA(7)-s、a.k.a。 名前付きパイプ、または使用する unix(7) ソケット;また読む 高度なLinuxプログラミング より多くの可能性を得るために。こちらもご覧ください イントロ(2) そして、 syscalls(2)

いくつかの共有メモリとセマフォを使用することもできます。 shm_overview(7) そして、 sem_overview(7)、または( レーダー)メッセージキュー、参照 mq_overview(7)。しかし、 信号(7)IPCの-sは一般に悪い考えです。

を注意 プロセッサ間通信 一般的に協力と修正が必要両方のプロセスの;言い換えれば、古いAと開始Bプロセスの両方のコードをおそらく変更する必要があります。そして、おそらくプロセスAが同意なしに情報を漏らしたくないでしょう。

ところで、あなたも使用してメモリを共有する可能性があります mmap(2) 例えば共通ファイル上。ただし、同期が必要です。

また読む proc(5);スルー /proc/1234/ プロセス1234に関するいくつかの情報を照会できます。

ところで、確かに パイプ(7)-sは非常に頻繁に設定されます(使用 パイプ(2)を呼び出す前に フォーク(2) 親プロセスと子プロセスの間では、これは必須ではありません。特に、プロセスを自分自身にパイプしたい場合があります(例: QtでのUnixシグナル配信)。