回答:
signal
実装によって異なるため、これは最も信頼できる方法ではありません。の使用をお勧めしsigaction
ます。トムのコードは次のようになります。
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
void my_handler(int s){
printf("Caught signal %d\n",s);
exit(1);
}
int main(int argc,char** argv)
{
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = my_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
pause();
return 0;
}
int s
引数としてとるべきだと思います。 sig_t
それ自体が関数ポインタ型です。
printf()
async-signal-safeではないため、シグナルハンドラー内では使用できません。
sa_mask
とはsa_flags
。
Windowsコンソールアプリの場合、SetConsoleCtrlHandlerを使用してCTRL+ CおよびCTRL+ を処理しBREAKます。
例については、こちらをご覧ください。
SIGINT シグナルをキャッチする必要があります(私たちはPOSIXを正しく話しているのですか?)
sigactionについては、@ Gab Royerの回答を参照してください。
例:
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
void my_handler(sig_t s){
printf("Caught signal %d\n",s);
exit(1);
}
int main(int argc,char** argv)
{
signal (SIGINT,my_handler);
while(1);
return 0;
}
void my_handler(sig_t s)
ましたvoid my_handler(sig_atomic_t s)
。