シグナルがスレッドからメインプロセスに到着するたびに、パイプを介してデータをチャネリングしようとしています。
これは可能ですか?
これはどのように行うことができますか?
問題:
- 子スレッドはデータを読み取り、それをキューに入れます。
- メインアプリケーションは独自の処理を実行しますが、データがキューで利用可能になると、スレッドから通知を受け、データの処理を開始する必要があります(メインスレッドはキューにアクセスできます)。
このシナリオはどのように実装する必要がありますか?
シグナルがスレッドからメインプロセスに到着するたびに、パイプを介してデータをチャネリングしようとしています。
これは可能ですか?
これはどのように行うことができますか?
このシナリオはどのように実装する必要がありますか?
はい、パイプを通して可能です。
ステップ1の呼び出しパイプを使用して、パイプを取得します。
#include <unistd.h>
int main(...)
{
int fileDescriptors[2];
pipe(fileDescriptors);
ステップ2はfileDescriptors[0]をメインプロセスに渡し、fileDescriptors1をスレッドに渡します。Mainでは、fileDescriptors [0]から読み取ることにより、パイプが書き込まれるのを待ちます。
...
char msg[100];
read(fileDescriptors[0], msg, 100); // block until pipe is read
}
ステップ3、スレッドから、シグナルが発生したときにfileDescritpors1に書き込みます
void signal_handler( int sig )
{
// Write to the file descriptor
if (sig == SIGKILL)
{
const char* msg = "Hello Mama!";
write(fileDescriptors[1], msg, strlen(msg));
}
}
それは可能ですが、それはかなり不必要です。パイプは、プロセス間通信を目的としています。スレッドは同じメモリを共有するため、ロックを正しく使用している限り、直接通信できます。
あなたがpipe()ではなく話しているなら|、そうです。パイプは通常、ファイル記述子として扱うことができます。パイプを開いて、一方のスレッドで入力をクリーンアップし、もう一方のスレッドで出力をクリーンアップする必要があります。
他の人が言っているように、これは価値があるよりも厄介かもしれません。
しかし、あなたが主張するならば。
popenスレッドを生成する前に、rwモードを使用して2つのパイプを開くだけでおそらく最も簡単です。メイン->スレッド用に1つを選択し、メイン<-スレッド用にもう1つを選択して、先に進みます。
または、2つの異なるプロセスであるかのように、スポーン後に合計4つのファイル記述子を開くことができます。
あなたはそれを行うことができます、apacheには同様の「グレースフルリスタート」オプションがあります。(ここを参照)。次のようなものを使用します:
#include <sys/types.h>
#include <signal.h>
kill(getppid(), SIGUSR1);
親に信号を送信します。他の人は、ファイル記述子を生成して親側でそれをキャッチするための上記のコードを持っています。
ただし、スクリプト化されたプロセス間通信のシグナルは避け、開始/停止/再開/更新などの「ユーザー送信」メッセージにのみ使用する傾向があります。それらを何に置き換えるかは、ユースケースによって異なります。メッセージング変数を使用するか、メインプロセスがサーバーループ内にある場合は、ループの上部にあるパイプを「選択」して、子が送信したかどうかを確認できます。メッセージを更新します。おそらく私が見逃している他の多くのものがあります。