FC2ブログ

[Windows][Visual Studio 2008][VC++]signal(CRT)

 VC++環境でsignalの動作を確認してみた。
 サンプルは、無限ループでひたすらコンソールに”.”を標準出力する。

 いろいろ試してみてわかったこと。

  • CTRL+CでSIGINTを発生させても、すぐにプロセスは終了しなかった
    (SIGINTを受信するとコンソールに”SIGINT\n”と表示されるが、その後も”.”が何個か表示されていた)
    (追記:どうやら、stdio.hで定義された入出力関数はシグナルに同期しない、つまりシグナル関数内では使用禁止の模様)
  • [タスク マネージャ]の[プロセス]タブから強制終了すると、SIGTERMを受信する前にプロセスが消滅するっぽい?
  • taskkill /fすると、SIGTERMを受信する前にプロセスが消滅するっぽい?

 強制終了がハンドリングできないところを見ると、上記の下二つは9番(SIGKILL)を投げていると考えればいいのでしょうか。

Sample1

#pragma once

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>


void SigFunc_Term(int i)
{
    printf("%s\n\0","SIGTERM\0");
    exit(SIGTERM);
}

void SigFunc_Int(int i)
{
    printf("%s\n\0","SIGINT\0");
    exit(SIGINT);
}

int main(int argc, char* argv[])
{
    signal(SIGTERM,SigFunc_Term);
    signal(SIGINT,SigFunc_Int);

    while(true)
    {
        printf(".");
    }

    return 0;
}

ample2

 しばらく待っているとプログラムが自らabort()を呼び出す。上記Sample1のコードに対して、SIGABRTのハンドラを追加してあり、abortが発生した時点で”SIGABRT”を標準出力するようになっている。

#pragma once

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>


void SigFunc_Term(int i)
{
    printf("%s\n\0","SIGTERM\0");
    exit(SIGTERM);
}

void SigFunc_Int(int i)
{
    printf("%s\n\0","SIGINT\0");
    exit(SIGINT);
}

void SigFunc_Abt(int i)
{
    printf("%s\n\0","SIGABRT\0");
    exit(SIGABRT);
}

int main(int argc, char* argv[])
{
    int i=0;

    signal(SIGTERM,SigFunc_Term);
    signal(SIGINT,SigFunc_Int);
    signal(SIGABRT,SigFunc_Abt);


    while(true)
    {
        printf(".");

        i++;

        if(i>100000)
        {
            abort();
        }
    }

    return 0;
}

Sample3

 上記Sample2のabort()呼び出しを、raise(SIGTERM)に変更。raise()関数は、プロセス自らシグナルを発行するランタイム関数。

#pragma once

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>


void SigFunc_Term(int i)
{
    printf("%s\n\0","SIGTERM\0");
    exit(SIGTERM);
}

void SigFunc_Int(int i)
{
    printf("%s\n\0","SIGINT\0");
    exit(SIGINT);
}

void SigFunc_Abt(int i)
{
    printf("%s\n\0","SIGABRT\0");
    exit(SIGABRT);
}

int main(int argc, char* argv[])
{
    int i=0;

    signal(SIGTERM,SigFunc_Term);
    signal(SIGINT,SigFunc_Int);
    signal(SIGABRT,SigFunc_Abt);


    while(true)
    {
        printf(".");

        i++;

        if(i>100000)
        {
            raise(SIGTERM);
        }
    }

    return 0;
}
スポンサーサイト



theme : プログラミング
genre : コンピュータ

FC2ブックマーク | この記事をokyuuへインポート | このエントリーを含むはてなブックマーク | ニフティクリップへ追加 | この記事をクリップ! | イザ!ブックマーク | POOKMARK Airlinesに登録する | del.icio.us |
動作未検証 | | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証 | 動作未検証

comment

管理者にだけメッセージを送る

カレンダー
08 | 2019/09 | 10
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -
最近の記事
月別アーカイブ
カテゴリー
ブログ内検索
RSSフィード
リンク
いろいろリンクボタン
埋め込みe-Words