2016-03-24 2 views
0

私はbashシェルをエミュレートするプログラムを書く必要があります。プログラムの関連部分はここにあります。プログラムは、EOFの受信時に終了する(図示せず)。実装するさまざまな機能の1つは、CTRL-Cを押したときにプログラムを終了させないことです。 SIGINTが受信された場合、プログラムは新しいコマンドプロンプトを再度表示するだけです。私は現在のループの反復を終了するグローバル変数を変更するハンドラ関数を持っているし、内側のループを再入力するためにそれを再度変更する外側のループ。しかし、CTRL-Cを押すとプログラムは終了します。どうしてこれなの?シグナル処理関数+無視しないSIGINT

あなたが主な機能でシグナルハンドラ関数を登録する必要が
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<unistd.h> 
#include<time.h> 
#include<signal.h> 
#include<sys/wait.h> 

void SIGINT_handler(int signum); 

static volatile sig_atomic_t endflag = 0; 

int main(int argc, char **argv){ 

    while(1){ 
     endflag = 0; 

     while(!endflag){ 

        struct sigaction action; 

        action.sa_handler = &SIGINT_handler; 
        action.sa_flags = 0; 

        if((sigemptyset(&action.sa_mask) == -1)||(sigaction(SIGINT, &action, NULL) == -1)){ 
          perror("Failed to set SIGINT handler"); 
          exit(EXIT_FAILURE); 
       } 
     } 
    } 

    return 0; 
} 

void SIGINT_handler(int signo){ 

    if(signo == SIGINT){ 
     endflag = 1; 
    } 
    fflush(stdout); 

} 
+0

コードが多かれ少なかれOKになります試してみてください主な機能

を入力した直後に

。コンパイル中に警告が表示されますか?コンパイラはどちらのOSを使用していますか? – alk

+0

シグナルハンドルから 'stdout'をフラッシュするのは良い考えではないかもしれません。また、グローバル・フラグが「揮発性」を定義する必要があるかどうかは疑問です。 – alk

+0

OSとコンパイラを投稿する必要があります。これはgccとclangを使ってMac上で動作しています。 – Harry

答えて

-1

は(無効)シグナル(SIGINT、SIGINT_handler)

を置きます。それはこの

int main(int argc, char **argv){ 

    (void) signal(SIGINT,SIGINT_handler); 

while(1){ 
    endflag = 0; 

    while(!endflag){ 

       struct sigaction action; 

       action.sa_handler = &SIGINT_handler; 
       action.sa_flags = 0; 

       if((sigemptyset(&action.sa_mask) == -1)||(sigaction(SIGINT, &action, NULL) == -1)){ 
         perror("Failed to set SIGINT handler"); 
         exit(EXIT_FAILURE); 
      } 
    } 
} 

return 0; 

}

+0

'sigaction()'の呼び出しはシグナルハンドラも登録します。 – alk

関連する問題