Ich habe versucht herauszufinden, ob dies möglich ist, so wie ich es gemacht habe oder nicht. Dieses Programm sollte einen untergeordneten Prozess forcieren, der das Drucken in STDOUT wiederholt, und das übergeordnete Element sollte beendet werden, um die Terminal-Eingabeaufforderung zurückzugeben. Das Kind sollte dann darauf warten, dass SIGINT ihm sagt, wann es geschlossen werden soll. Ich erinnere mich jedoch daran, dass SIGINT nur an Prozesse im Vordergrund gesendet wird, was erklärt, warum mein verlassenes Kind nicht von STRG + C beeinflusst wird. Gibt es eine Möglichkeit, das verlassene Kind entweder dazu zu bringen, ein vom Terminal gesendetes Signal zu empfangen, oder einen Systemaufruf im Terminal, um es in den Vordergrund zu bringen, wo es SIGINT empfangen kann? Oder ist meine Suche hoffnungslos?Problem beim Senden des Signals an den untergeordneten Prozess in C
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);
}
Das funktioniert eigentlich perfekt! Ich muss mehr in Prozessgruppen schauen. Vielen Dank! – JKomusin
@JKomusin: Es ist nicht wirklich eine perfekt robuste Lösung, siehe Update. – caf