GNU/Linux >> Linux の 問題 >  >> Linux

プログラムがctrl cで終了したときに関数を呼び出す

signal() 一部の OS では危険である可能性があり、Linux では推奨されておらず、sigaction() が推奨されています . 「シグナル対サイガアクション」

これは、最近出くわした例 (「割り込み信号をタップする」) で、いじっていたときに修正したものです。

#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<string.h>

struct sigaction old_action;

void sigint_handler(int sig_no)
{
    printf("CTRL-C pressed\n");
    sigaction(SIGINT, &old_action, NULL);
    kill(0, SIGINT);
}

int main()
{

    struct sigaction action;
    memset(&action, 0, sizeof(action));
    action.sa_handler = &sigint_handler;
    sigaction(SIGINT, &action, &old_action);

    pause();

    return 0;
}

完全に機能する例については、次のコードを試すことができます:

#include <signal.h>
#include <stdio.h>
#include <stdbool.h>

volatile bool STOP = false;
void sigint_handler(int sig);

int main() {
    signal(SIGINT, sigint_handler);
    while(true) {
        if (STOP) {
            break;
        }
    }
    return 0;
}

void sigint_handler(int sig) {
    printf("\nCTRL-C detected\n");
    STOP = true;
}

実行例:

[[email protected]]$ ./a.out 
^C
CTRL-C detected

SIGINT をキャッチする必要があります。このようなもの:

void sigint_handler(int sig)
{
    [do some cleanup]
    signal(SIGINT, SIG_DFL);
    kill(getpid(), SIGINT);
}

詳細はこちら


Linux
  1. プログラムによってアクセスされるファイルを一覧表示しますか?

  2. Sigkillシグナルが送信された場合、プログラムは何をしますか?

  3. EINTR をチェックして関数呼び出しを繰り返すのはいつですか?

  1. ptrace() でシステム コールをキャンセルする

  2. カーネルモジュールコードにポーリング機能を追加するには?

  3. &を使用してバックグラウンドで実行すると、Python スクリプトの Nohup が機能しない

  1. 既存の関数と同じ名前のパスで実行可能ファイルを実行しますか?

  2. Teeコマンドでプログラムを機能させる方法は?

  3. シェルが終了したときにバックグラウンドジョブが強制終了されるか、強制終了されるかを正確に決定するものは何ですか?