次のように sigaction を使用してシグナルハンドラーをセットアップしました。
struct sigaction act, oldact;
memset(&act, 0, sizeof(struct sigaction));
act.sa_handler = sig_handler;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGALRM);
sigaddset(&act.sa_mask, SIGINT);
sigaddset(&act.sa_mask, SIGTERM);
sigaddset(&act.sa_mask, SIGTSTP);
sigaction(SIGALRM, &act, &oldact);
sigaction(SIGINT, &act, &oldact);
sigaction(SIGTERM, &act, &oldact);
sigaction(SIGTSTP, &act, &oldact);
act.sa_flags = 0;
これに続いて、for ループを実行して入力を収集し、それを出力します (基本的には cat のように動作します)。
char *linebuf = NULL;
size_t n = 0;
int len;
while(1){
len = getline(&linebuf, &n, stdin);
if(len>0){
printf("%s", linebuf);
}
}
ただし、シグナルの処理からgetline()
戻ると、入力をブロックしなくなり、代わりに中断されたシステムコール-1
を設定errno
している間、一貫して戻ります。EINTR
私は明らかに中断するつもりでしたgetline()
が、入力を読み続けることができるようにリセットするにはどうすればよいですか?
私の問題を実際には解決しない同様の質問がいくつかありましたが、問題をよりよく理解するのに役立つかもしれません. 1 2
もう 1 つの興味深い情報はsignal()
、シグナル処理に使用していたときにはこの問題は発生しなかったが、 sigaction()
POSIX に準拠しているため変更したことです。