wie behandeln Sie das signal Ctrl + Z in der mini-shell. C
Ich versuche, setzen Sie den Prozess aus, aber es funktioniert nicht.
dies ist Teil des Codes. es gibt Strg+Z und Strg+C. Strg+C funktioniert. Ich Schaffe es nicht, warum mit Z funktioniert es nicht.
(der eigentliche code):
//ctrl+Z
void sigstop(int p){
signal(SIGTSTP,&sigstop);
kill(my_pid,SIGSTOP);
fflush(stdout);
}
//Ctrl+C
void sigkill(int p){
signal(SIGINT,&sigkill);
kill(my_pid,SIGKILL);
fflush(stdout);
}
Code in der main-Methode:
...
my_pid = fork();
if (my_pid == 0) {
signal(SIGTSTP,&sigstop); //for Ctrl+Z
signal(SIGINT,&sigkill); //for Ctrl+C
checkCommand();
execvp(argv[0], argv);
exit(getpid());
}
Sie sollten nicht nennen
Ihre
Sie sollten sich nicht registrieren einen handler für
ja, tatsächlich änderte ich den code vor. es hat stdout, und ich habe auch int als parameter. aber seine immer noch nicht funktioniert. versehentlich setzte ich älteren code.
was SIGTSTP? was soll ich tun?
fflush
auf stdin
da dies zu undefiniertem Verhalten.Ihre
sigstop
und sigkill
Funktionen ein int
parameter: der compiler müsste, dass Sie die Warnungen über die falsche Funktion Unterschrift.Sie sollten sich nicht registrieren einen handler für
SIGTSTP
da das Standardverhalten ist, um den Prozess zu stoppen.ja, tatsächlich änderte ich den code vor. es hat stdout, und ich habe auch int als parameter. aber seine immer noch nicht funktioniert. versehentlich setzte ich älteren code.
was SIGTSTP? was soll ich tun?
InformationsquelleAutor Khuseyn | 2011-02-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anstelle der Installation der signal-Handler für
SIGTSTP
undSIGINT
, setzen Sie das terminal in den raw-Modus mitcfmakeraw
odertcsetattr
. ^C und ^Z wird dann gelesen werden als gewöhnliche Zeichen, die viel weniger lästig. Allerdings müssen Sie dann umsetzen line-editing-sich - GNU readline ist Ihr Freund da. Weitere Hinweise finden Sie in der Die Implementierung einer Shell und Job-Steuerung Abschnitte der GNU C Library Manual. (Sie können Sie bedenkenlos ignorieren den Teil, wo er versucht, Sie zu warnen, dass die job-Kontrolle möglicherweise nicht vom kernel unterstützt werden -- wenn jemand noch mit einer diese Systeme mehr, Sie haben nur selbst Schuld.)Sie sollten thrysoee.dk/editline statt GNU readline, aber gute Antwort.
Gibt es irgendeinen tatsächlichen Vorteil editline neben der großzügigeren Lizenz? (Das ist keine rhetorische Frage, ich weiß es nicht.)
Ich habe gesehen, reduziert Speichernutzung; andere als die Kostenlose Lizenz gibt es nicht ein großer Unterschied wenn.
InformationsquelleAutor zwol
Ich denke, dass der Aufruf kill() in das sigkill-Funktion, gerade beginnt eine unendliche, rekursive Schleife, wo der kill() ruft nur wieder das sigkill-Funktion, die fordert, kill (), welche Anrufe wieder sigkill-Funktion... usw... Anstelle von Aufruf kill(), legen Sie eine Globale boolean-variable an und prüfen Sie es in Ihrer main-Funktion. Wenn diese Globale Boolesche variable gesetzt, die Sie gerade würdevoll beenden.
Etwas wie:
InformationsquelleAutor Magallo