I’ve been trying to figure out if this is possible the way I’ve done it or not. This program should fork a child process that loops printing to STDOUT, and the parent should exit to return the terminal prompt. The child should then be waiting for SIGINT to tell it when to close down. However I remember reading that SIGINT is only send to processes in the foreground, which explains why my abandoned child isn’t affected by CTRL+C. Is there any way to either get the abandoned child to receive a signal sent from the terminal, or some system call in the terminal to bring it to the foreground where it can receive SIGINT? Or is my search hopeless?
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);
}
If you want your child to recieve
SIGINTwhen the interrupt character is hit on the controlling terminal, it needs to be in the foreground process group. You can achieve this:(You have to wait until the shell changes the foreground process group after your parent exits, though – I’m not sure of a better way to do that than spinning in a loop, as in the example. Suggestions welcome…)
PS: Be aware that the foreground process group can change at any time – for example, when another process is run from the shell. I’m not sure exactly what your end goal is, but maybe there’s a better way to do it, whatever it is.