私は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);
}
コードが多かれ少なかれOKになります試してみてください主な機能
を入力した直後に
。コンパイル中に警告が表示されますか?コンパイラはどちらのOSを使用していますか? – alk
シグナルハンドルから 'stdout'をフラッシュするのは良い考えではないかもしれません。また、グローバル・フラグが「揮発性」を定義する必要があるかどうかは疑問です。 – alk
OSとコンパイラを投稿する必要があります。これはgccとclangを使ってMac上で動作しています。 – Harry