シェルを介してsigaction/sigqueueを送信する

シェルを介してsigaction/sigqueueを送信する

シグナルを使用して複数のシグナルを処理してさまざまなタスクを実行する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

マンページでは、それに基づいて構築する方法に関する詳細情報を提供します。

おすすめ記事