Ich mache einen Parser bekommen Zeichen bis EOF
, ich handle die Signale SIGTERM
, SIGINT
, SIGTSTP
und SIGQUIT
. Wenn ich also ein Signal mit Ctrl +C (zum BeispielSIGINT
) die Signal-Handler drucken Ctrl +C senden und dann muss weitergehen, aber weiterhin nicht.Ctrl Signale füllt Stdin mit EOF?
Ich fand heraus, dass nach jedem Ctrl Signal, ein EOF
füllt den Puffer, aber ich weiß nicht, wie man es loswerden. Ich habe versucht, while(getc(stdin) != EOF);
innerhalb der Handler zu tun, aber der Parser verhalten sich normal, "Essen" jedes Zeichen eingegeben bis EOF
.
Wie kann ich ein Ctrl Signal empfangen, ohne meine stdin
zu verpfuschen?
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
static void nsh_signal_handler(int code)
{
char c;
switch(code)
{
case SIGQUIT: c = '\\'; break;
}
fprintf(stdout, "I will do nothing about your Ctrl - %c\n", c);
}
int main(void)
{
int c;
struct sigaction s;
s.sa_flags = 0;
s.sa_handler = nsh_signal_handler;
sigfillset(&s.sa_mask);
sigaction(SIGQUIT, &s, NULL);
do
{
c = getc(stdin);
printf("[%c][%d]\n", c, c);
}
while(c != EOF);
return 0;
}
Der obige Code zeigt diesen Fehler.
Hinweis [Wie vermeidet man die Verwendung von 'printf()' in einem Signal-Handler?] (Http://Stackoverflow.com/questions/16891019/) –
Hinweis: Setzen Sie in 'nsh_signal_handler()' 'char c = ' ? '; 'oder etwas, um zu vermeiden, einen nicht initialisierten Wert mit' fprintf (stdout, "I ...% c \ n", c) zu drucken; ' – chux