Signals, parent & children processes

Alex Vinokur alexvn@users.sourceforge.net
Fri Dec 2 17:36:00 GMT 2005


"Alex Vinokur" <alexvn@users.sourceforge.net> wrote in message news:dmpslm$2sj$1@sea.gmane.org...
>
> -----------------------
> CYGWIN_NT-5.0 1.5.18
> Windows 2000
> ----------------------
>
>
> /* --------------------- */
> void sigINT_handler1 (int sig_i)
> {
>   fprintf (stderr, "sigINT_handler1: pid#%d ignores a signal %d\n", getpid(), sig_i);
>   signal (SIGINT, sigINT_handler1);
> }
>
> void sigINT_handler2 (int sig_i)
> {
>   fprintf (stderr, "sigINT_handler2: pid#%d ignores a signal %d\n", getpid(), sig_i);
>   signal (SIGINT, sigINT_handler2);
> }
>
> int main()
> // fragments of code
> {
>   sigINT_handler1 (SIGINT);
>
>   if (fork() > 0)  // Parent
>   {
>     // Stuff
>     waitpid (pid, &status, 0);
>   }
>   else  // Child
>   {
>     sigINT_handler2 (SIGINT);
>     execvp (<args>);
>   }
> }
>
> Parent catchs SIGINT via sigINT_handler1,
> but Child doesn't catch SIGINT via sigINT_handler2.
>
> How can Child catch SIGINT with its own signal handler?
>
>
It seems that code below does that..

// -----------------------------
int foreground_flag = 1; /* 1 - foreground, 0 - backgroung */

int main ()
{

  while (1)
  {
    signal (SIGINT, SIG_IGN);

    pid = fork();

    if (pid < 0)  /* Error while fork */
    {
      perror ("Unable to execute fork");
      continue;
    }

    if (pid > 0)  /* Parent */
    {
      if (foreground_flag == 1) waitpid (pid, &status, 0);
    }
    else  /* Child */
    {
      if (foreground_flag) signal (SIGINT, SIG_DFL);}
      else signal (SIGINT, SIG_IGN);

      execvp (<args>);
    }

  }

  return 0;
}
// -----------------------------



-- 
 Alex Vinokur
     email: alex DOT vinokur AT gmail DOT com
     http://mathforum.org/library/view/10978.html
     http://sourceforge.net/users/alexvn





--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/



More information about the Cygwin mailing list