シグナルを使用して複数のシグナルを処理してさまざまなタスクを実行するC ++プログラムがあります。
signal(SIGHUP, signal_handler);
私はこのシグナル処理を拡張してプログラムにさまざまなジョブ要求を送信できるようにしたいと考えていました。
sigaction(SIGUSR1, &act, 0);
私が知っている限り、sigvalオブジェクトに追加情報を設定して、受信側でプログラムが実行するように要求されていることを知ることができ、他のプログラムからこのタイプの信号を送信できます。
私が知りたいのは、bashのシェルスクリプトを介してこの種のシグナル情報を送信する方法です。可能ですか?を使用してプログラムにシグナルを送信できますが、を使用しkill -S SIGHUP [PID]
て追加のパラメータを送信する方法が見つかりませんkill
。それで、bashにsigaction / sigqueueの動作をシミュレートして信号を送信できるコマンドがあるかどうか疑問に思います。タスクを実行するために他のアプリを開発する必要がなく、私のアプリケーションです。
答え1
これはうまくいきます。まず、追加情報への関心を示すようにSA_SIGINFO
設定します。.sa_flags
#include <signal.h>
#include <unistd.h>
void act(int s, siginfo_t *i, void *v)
{
//printing from here is unsafe but this is for testing
//purposes only
printf("pid=%d val=%d\n", i->si_pid, i->si_value.sival_int);
}
int main(int argc, char **argv)
{
struct sigaction sa = {
.sa_sigaction=act ,
.sa_flags = SA_RESTART|SA_SIGINFO
} ;
sigaction(SIGUSR1, &sa, NULL);
printf("%d\n", (int)getpid());
for(;;){
pause();
}
}
次に、この種の追加情報を送信できる独自のkill(er)アプリケーションを作成します。
#include <signal.h>
#include <unistd.h>
int main(int argc, char**argv)
{
union sigval val = { .sival_int = atoi(argv[2]) };
sigqueue((pid_t)atoi(argv[1]), SIGUSR1, val);
}
両方の実行可能ファイルをコンパイルすると、2番目の実行可能ファイルを使用して最初の実行可能ファイル()に整数を送信できます./second pid int
。
マンページでは、それに基づいて構築する方法に関する詳細情報を提供します。
答え2
あなたの情報が古いようです。私のsigaction
マニュアルページから:
文書化されていません。 SA_SIGINFOが導入される前に、struct sigcontext型の2番目のパラメータと一緒にsa_handlerを使用していくつかの追加情報を取得することもできました。この使用法は現在廃止されました。
答え3
追加のパラメータは とsigqueue()
を使用して送受信できます。 「この使用法は廃止されました」とは、2番目の引数が2つの引数を使用することを意味します。導入後、すべてのハンドラはこのフィールドでパラメータを使用するため、文書化されていないハンドラを使用する必要はありません。si_value
siginfo_t
sigaction()
sa_handler
sigcontext
SA_SIGINFO
siginfo_t
si_value
しかし、シェルのペイロードで信号をキューに入れる方法がわかりません。これを行うには、小さなCプログラムを書く必要があるかもしれません。
答え4
これで、procps-ngの最新バージョンのkillを使用してこれを行うことができます。
kill -q <value> -<signal> <pid>
望むより:https://gitlab.com/procps-ng/procps/-/merge_requests/32