Probleme mit dem senden signal-zu-Kind-Prozess in C
Habe ich versucht herauszufinden, ob dies möglich ist, die Art, wie ich es getan habe oder nicht. Dieses Programm soll die Gabel einen untergeordneten Prozess, Schleifen-Druck auf STDOUT, und die Eltern sollten Sie exit, um die Rückkehr der terminal-Eingabeaufforderung. Das Kind sollte dann warten, für die SIGINT zu sagen, Wann es zu schließen. Aber ich erinnere mich gelesen zu haben, dass die SIGINT ist nur zu senden, um Prozesse in den Vordergrund, was erklärt, warum mein verlassenes Kind gar nicht betroffen ist, indem Sie STRG+C. gibt es eine Möglichkeit, entweder das verlassene Kind zu empfangen ein signal aus dem terminal, oder ein system-Aufruf im terminal, um es in den Vordergrund, wo es empfangen kann SIGINT? Oder ist meine Suche hoffnungslos?
Code:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
/* signal handler for the child process */
void catchInt (int signum)
{
printf("\nMy sincerest apologies, master\n");
exit(0);
}
/* signal handler for the parent process */
void ignoreInt (int signum)
{
/* prevent any extra output from being printed */
fflush(stdout);
/* wait for child to apologize before replying */
wait(NULL);
printf("You're welcome\n");
exit(0);
}
/* signal handler for the child's alarm */
void catchAlarm (int signum)
{
printf("It's great to be alive\n");
/* reset the alarm */
signal(SIGALRM, catchAlarm);
alarm(3);
}
int main () {
pid_t pid;
/* fork process */
pid = fork();
if (pid < 0) /* error handler */
{
fprintf(stderr, "Fork Failed");
exit(-1);
}
/* child */
else if (pid == 0)
{
printf("It's great to be alive\n");
/* catch SIGINT and handle as the child should */
signal(SIGINT, catchInt);
/* catch SIGALRM being sent by alarm() */
signal(SIGALRM, catchAlarm);
/* set alarm for 3 seconds */
alarm(3);
for ( ;; )
{
printf("I have 42001 children and not one comes to visit\n");
usleep(500000);
}
}
/* parent */
else
{
/* exit to abandon child process in the background */
exit(0);
}
return(0);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, dass Ihr Kind zu erhalten
SIGINT
wenn die interrupt-Charakter ist der hit auf dem kontrollierenden terminal, es muss in der Vordergrund-Prozessgruppe. Dies können Sie erreichen:(Sie müssen warten, bis die shell ändert sich der Vordergrund-Prozessgruppe, nachdem Sie Ihre Eltern verlässt, obwohl ich nicht sicher bin ob es ein besseren Weg zu tun, als drehen in einer Schleife, wie in dem Beispiel. Vorschläge willkommen...)
PS: bewusst Sein, dass der Vordergrund-Prozessgruppe können sich jederzeit ändern - zum Beispiel, wenn ein anderer Prozess von der shell. Ich bin mir nicht sicher, was genau dein Ziel ist, aber vielleicht gibt es einen besseren Weg, es zu tun, egal was es ist.
Können Sie die
kill
Befehl zu senden, der ein signal an einen bestimmten Prozess Nummer:Natürlich, es hilft, wenn Ihr code identifiziert die PID zu töten (das Kind sollte Bericht die PID, wenn es beginnt looping). Aber mit nur triviale änderungen (wie das weglassen der ungenutzten ignoreInt () - Funktion, und die Berichterstattung der Kind-Prozeß ist PID), es funktionierte OK, wie geschrieben - und der kill-Befehl funktionierte es auch.
Komprimierten code:
Wenn Sie noch
<sys/types.h>
, es sollte in der Regel der erste der POSIX-Header (und damit vor<unistd.h>
). Die Tatsache, dass es als letztes aufgeführt ist, deutet darauf hin, dass, sollten Sie überhaupt nicht benötigen - aber ich glaube, ich erinnere mich an eine frühere Frage, wo Sie geltend gemacht, dass es notwendig war. (OTOH, es ist kein Aufruf zu irgendeiner derwait()
Familie, so<sys/wait.h>
unnötig ist, und ich bin mäßig überzeugt, dass<sys/types.h>
ist nicht erforderlich, auf den meisten modernen Systemen.)Nein, die
SIGINT
signal nur gesendet, um Vordergrund-Prozesse , wenn es sanktioniert, indem Sie mit STRGC (oder was auch immerstty
hat dieintr
Tastendruck eingestellt).Können Sie immer senden Sie ein SIGINT an einen bestimmten Prozess mit
kill -INT 99999
(wo99999
ist die Prozess-ID).