Killing a background process from a C program
D Venkatrangan
venkat at matrix.UUCP
Fri Jul 27 07:08:00 AEST 1990
In article <1990Jul19.151728.17448 at ncs.dnd.ca> marwood at ncs.dnd.ca (Gordon Marwood) writes:
>I am in the process of converting a Bourne shell script to C, and I am
>having trouble finding out how to identify and kill background
>processes. With the Bourne Shell approach this was simple, using $!.
>
>What I would like to do is start a background process at one point in the
>C program, and at a later time kill it. Currently I am invoking the
>background process with system("background_process &");, but none of the
>texts that I have available help me to proceed any further.
>
>Any assistance would be appreciated.
>
Instead of system(), try using vfork() followed by execlp().
In foreground program, do something like:
if ((child_pid = vfork()) == -1)
perror("vfork failed");
if (child_pid == 0) {
execlp(execfile, execfile, arg1, arg2, ..., (char *)0);
/* should not return */
perror("exec failed");
}
/* parent */
/* if we get killed... */
(void)signal(SIGINT, kill_child);
/* call kill_child() to send a user defined signal to child. */
/* or just call kill(child_pid, SIGUSR1); */
void
kill_child(sigval)
int sigval;
{
if (sigval == SIGINT)
kill(child_pid, SIGUSR1);
}
In child, during initialization do:
(void)signal(SIGUSR1, childsighandler);
and define:
void
childsighandler(sigval)
int sigval;
{
if (sigval == SIGUSR1) { /* the parent is sending something */
cleanup();
exit();
}
}
More information about the Comp.unix.questions
mailing list