私はシェルをcで書こうとしています。その一部は、SIGTSTP信号を捕捉し、プログラムをフォアグラウンド専用モードに出し入れするように設定するハンドラです。シェルはc:キーボードのEnterキーを押した後にSIGTSTPにしか応答しません。
: ^Z
Entering foreground-only mode (& is now ignored)
: //":"should show up own automatically on the next line after I press ctrl-z, then enter
: ^Z
Exiting foreground-only mode
:
:私は出力がこのisteadのように見えることができます願ってい
: ^ZExiting foreground-only mode //pressed ctrl+z
//nothing here, had to press enter again
: //pressing enter just gives me another :, which is what I want
: ^ZEntering foreground-only mode (& is now ignored)
^ZExiting foreground-only mode
:
//global variables
int global;
//header
void catch_tstp(int);
//main function
int main(int argc, char** argv){
...
// initiate sigaction struct for CTRL-Z action
struct sigaction ctrlz_act;
ctrlz_act.sa_handler = catch_tstp;
ctrlz_act.sa_flags = SA_SIGINFO|SA_RESTART;
sigfillset(&(ctrlz_act.sa_mask));
sigaction(SIGTSTP, &ctrlz_act, NULL);
global = 0;
...
}
//handler
void catch_tstp(int sig){
if(sig == SIGTSTP){
if(global){
global=0;
printf("Entering foreground-only mode (& is now ignored)\n");
}
else{
global=1;
printf("Exiting foreground-only mode\n");
}
}
}
が今の私の出力は次のようになります。ここでは
はコードの関連するスニペットです
誰かが私が間違っていることを指摘できますか?どんな助けでも大歓迎です。ありがとうございました!
シグナルハンドラから 'global'のような非定数ファイルスコープ変数に安全にアクセスするには、' volatile'で 'sig_atomic_t'型でなければなりません。私はあなたの失敗があなたの問題に直接的な責任はないと思っています。 –
私はそれに応じて 'global'を改訂しましたが、問題は解決されませんでした。 –
また、 'sa_sigaction'メンバーではなく' struct sigaction'の 'sa_handler'メンバーを使用しているので、' SA_SIGINFO'フラグを 'sigaction()'に指定しないでください。これは重大な問題ですが、フラグを削除しても観測された動作は変わらないと思います。 –