2017-01-18 8 views
0

私は同じような質問をthisのリンクで読んだが、それは私の問題を解決しなかったので、繰り返しの質問にお詫び申し上げます。Cでシグナルハンドラから戻り値を取得するにはどうすればよいですか?

私はプログラムが実行されるときに基本的にCtrl + CとCtrl + Zを受け取る次のコードを持っていますが、端末から信号を受け取ったときに2を返すようにしたいと思います。

リンクでは、typedefを使用していて、C言語にはまったく新しいことがありました。私が持っているコードでは、その実装方法はわかりません。ここで

はコードです:

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

/* Signal Handler for SIGINT */ 
void sigintHandler(int sig_num) { 

    signal(SIGINT, sigintHandler); 
    printf("\n Cannot be terminated using Ctrl+C \n"); 
    fflush(stdout); 
} 

/* Signal Handler for SIGTSTP */ 
void sigtstpHandler(int sig_num) { 
    signal(SIGTSTP, sigtstpHandler); 
    printf("\tCtrl+z received\n"); 
    fflush(stdout); 
} 

int main (void) { 

    signal(SIGINT, sigintHandler); 
    signal(SIGTSTP, sigtstpHandler); 

    while(1) {} //infinite loop. 
    return 0; 
} 

はあなたの時間/助けをいただき、ありがとうございます。

編集:私は1だけではなく、ボイドを返すために、現在

void sigintHandler(int sig_num) 
    void sigtstpHandler(int sig_num) 

ある2シグナルハンドラ関数にしたいと思います。だから、私は何かをすることができるように

int sigIntReturn = signal(SIGINT, sigintHandler); 

の主な機能です。

+2

質問が分かりません。 1に何を返しますか? –

+0

@DavidSchwartz申し訳ありません。私は私の質問に編集を加えました。読んでください。 – user100000

+1

標準では 'void'が必須です。値を返すことはできません。代わりに( 'volatile')グローバル変数を使用してください(' errno'のように)。 – pmg

答えて

0

シグナルハンドラは割り込みと似ており、誰にも返されません。あなたが投稿したリンクは、シグナルハンドラを設定している間に値を返すことについて話していますが、シグナルハンドラの戻り値ではありません(signalはシグナルハンドラを設定するだけです)。

ただし、信号が発生するたびにmainから戻るには、次のような操作を行うことができます。

volatile int g_flag = 0; 
void sigintHandler(int sig_num) { 

    signal(SIGINT, sigintHandler); 

    /* Not safe to use these functions in a signal handler */ 
    printf("\n Cannot be terminated using Ctrl+C \n"); 
    fflush(stdout); 
    g_flag = 1; 
} 

int main (void) { 

    signal(SIGINT, sigintHandler); 
    signal(SIGTSTP, sigtstpHandler); 

    while(g_flag == 0) {} //infinite loop. 
    return g_flag; 
} 

これは推奨されないメインのビジーループですのでご注意ください。あなたは、eventfdのようなものを使って信号を送ります。

+4

これは動作しません。コンパイラ以外のコンポーネントは 'while'ループを最適化して' g_flag'をチェックしません( 'volatile'でも)。あなたは 'sig_atomic_t'か同等のものを使う必要があります - Cの標準を見てください。 –

+0

また、pthread条件付き待機はシグナルセーフではないため、使用できません。 –

+0

これを指摘してくれてありがとう。しかし、どのような参照をなぜvolatileと宣言されていても最適化されていると言いますか?はい、ミューテックスを使用するため、条件付き待機は使用できません。 eventfdのようなものは良いです。 – user1969104

関連する問題