web-dev-qa-db-ja.com

SIGUSR1とSIGUSR2をトリガーする方法

私はCのシグナルに精通しています。どのようなシグナルSIGUSR1およびSIGUSR2は、どのようにトリガーできますか。誰も私にそれを説明できますか?

47
haunted85

これらはユーザー定義シグナルであるため、特定のアクションによってトリガーされることはありません。プログラムで明示的に送信できます。

#include <signal.h>

kill(pid, SIGUSR1);

ここで、pidは受信プロセスのプロセスIDです。受信側では、それらのシグナルハンドラを登録できます。

#include <signal.h>

void my_handler(int signum)
{
    if (signum == SIGUSR1)
    {
        printf("Received SIGUSR1!\n");
    }
}

signal(SIGUSR1, my_handler);
69

それらは、アプリケーション開発者が使用するシグナルです。カーネルはこれらをプロセスに送信すべきではありません。 kill(2)またはユーティリティkill(1)を使用して送信できます。

同期にシグナルを使用する場合は、リアルタイムシグナルを確認することをお勧めします(シグナルがさらにある、キューに入れられている、配信順序が保証されているなど)。

6
cnicutar

ターミナル1

dd if=/dev/sda of=debian.img

ターミナル2

killall -SIGUSR1 dd

ターミナル1に戻ります

34292201+0 records in
34292200+0 records out
17557606400 bytes (18 GB) copied, 1034.7 s, 17.0 MB/s