タイトルが示すように、bashスクリプトで実行されたときにC ++プログラムにシグナル、警告、メッセージなどを送信できるようにしたいです。スクリプトはパラメータを使用してプログラムを起動するいくつかの解決策を見ましたが、プログラムがすでに実行されているときに発生する必要があります。これを行う方法はありますか?デフォルトでは、スクリプトがバックグラウンドで実行されている間にエラーが発生した場合は、OSのどこかに書き込まれるのではなく、プログラムに直接報告されることを望みます。私はRed Hat 8を使用しています。
ありがとう
答え1
信号を送る:
kill -s signal -- pid_of_your_app
signal - 送信する信号です。名前または番号で指定できます。
データ送信:
echo "text_message" | your_app
または
cat file | your_app
| - コマンドの標準出力をプログラムの標準入力に送るパイプです。
修正する:
信号処理に関してはデフォルトで終了するため、アプリケーションは信号を処理する必要があります。 (kill(9)を除くすべての信号にハンドラを割り当てることができます。) https://en.cppreference.com/w/cpp/utility/program/signal
#include <csignal>
void signal_handler(int signal);
// Install a signal handler
std::signal(SIGINT, signal_handler);
答え2
起動時に既知のパス名を使用してfifo(名前付きパイプ)を作成し、終了時にfifoを削除するようにリスナーを調整できます。通常、受信者は書き込み用に同じfifoを開くようにしてそれを開いたままにします。ビルダーのないパイプは、リーダーにEOFを通知する傾向があります。
データがないと待つことなく、FIFOのデータを定期的にポーリングできます。私はC ++をしませんが、Cではfifo O_NONBLOCKを表示するだけです。 C++にも同様のメカニズムがあります。
その後、他のプロセスでは、fifoが存在することを確認し(アクティブリーダーがあることがわかります)、受信者が理解できるテキストを送信できます。
ブロックよりもスレッドを好む場合は、ブロックFIFOを読み取ってスレッドメカニズム内で同期する別のスレッドを持つことができます。
信号の問題の1つは、受信者のpidを識別する必要があることです。 fifoを使用すると、安定した命名方法が提供されます。
編集:信頼できる開始条件と終了条件を使用して、名前付きパイプを介してクライアントの数に関係なく、サーバーにメッセージを送信できるソリューションのプロトタイプを作成します。欠点はBashにあることです。クライアント用の40行、サーバー用の65行。