sende SIGINT an Kind-Prozess
Ich versuche, erstellen einen untergeordneten Prozess, und senden Sie dann SIGINT an dem Kind, ohne die Kündigung der Eltern. Ich versuchte dies:
pid=fork();
if (!pid)
{
setpgrp();
cout<<"waiting...\n";
while(1);
}
else
{
cout<<"parent";
wait(NULL);
}
aber wenn ich drücken Sie C-c beide Verfahren wurden beendet
- Statt
while(1);
verwendenwhile(1) sleep(1);
Viel leichter auf die CPU. - Im Allgemeinen, anstatt
while(e);
tun, sondernwhile(e) continue;
, aber in diesem Fall was wallyk sagte. - DigitalRoss: Wie ist mit weiter anders hier?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie versuchen, die Umsetzung ein SIGINT-signal-handler, die, wenn ein Kind-Prozess ausgeführt wird, tötet der child-Prozess (und wenn nicht, beendet die Anwendung).
Alternativ, setzen Sie die Eltern SIGINT-handler zu SIG_IGN und das Kind auf SIG_DFL.
sigaction
ändern Sie den signal-handler, für die Eltern und es hat funktioniert, aber wenn es versucht die Eltern zu SIG_IGN und das Kind auf SIG_DFL sowohl Kind und Eltern ignoriert das signal.Nicht, verwenden Sie STRG-C, sendet dies ein signal an alle Prozesse mit der gleichen controlling-terminal (ie, in der gleichen Sitzung). Das ist etwas, das
setpgid
nicht ändern, obwohl ich denke, dass es einesetsid
(session-ID) nennen für diesen Zweck.Die einfachste Lösung ist einfach das Ziel, den spezifischen Prozess eher als eine Sitzung. Von der Befehlszeile aus:
C:
wobei pid die Prozess-ID, die Sie wollen, um das signal zu senden, um.
Kann der Elternteil erhalten die entsprechenden PID aus dem Rückgabewert von
fork()
. Wenn ein Kind will seine eigene PID, ruft esgetpid()
.Aha, das Geheimnis der Prozessgruppen und sessions und Prozessgruppen-Führer und Sitzung Gruppe Führer wird erneut angezeigt.
Ihre Kontroll - /C gesendet, die das signal zu einer Gruppe. Sie benötigen, um das signal zu einem einzelnen pid, so Folgen Sie paxdiablo in der Bedienungsanleitung oder signal ("töten") das Kind von den Eltern. Und nicht damit beschäftigt zu warten! Setzen Sie ein sleep(1) in der Schleife, oder besser noch, eine der wait(2) system calls.