On Fri, Jul 31, 2009 at 12:57 PM, Denis Kirjanov <[email protected]> wrote:

> On Fri, Jul 31, 2009 at 8:43 AM, Andy Dalton<[email protected]> wrote:
> > Denis,
> >
> > You have a race condition.  If the parent process gets scheduled first
> and
> > executes the pause() before the child runs and sends the SIGUSR1 signal,
> you
> > get the behavior you're expecting.  However, if the child gets scheduled
> > first and sends the signal before the parent has executed pause(), when
> the
> > parent eventually gets scheduled it will execute the pause() and block
> > waiting for some signal (after the signal send by the child has already
> been
> > received and handled).
> >
>
I have modified the code to avoid the race condition so that both of them
terminate
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

void trap1(int sig)
{
  fprintf(stderr, "signal\n");
}
int main()
{
  int stat;
  signal(SIGUSR1, trap1);
  int process_id = fork();


  if (process_id) {
  printf("I am parent\n",process_id);
  pause();
  wait(&stat);
  exit(0);
  }
  else if (process_id == 0)
  {
  printf("I am child\n",process_id);
  sleep(2);
  }
  kill(getppid(), SIGUSR1);
  exit(0);
}




>
> > Andy
> >
>
> This is similar to the truth. Thanks.
>
> --
> Regards,
> Denis
>
> --
> To unsubscribe from this list: send an email with
> "unsubscribe kernelnewbies" to [email protected]
> Please read the FAQ at http://kernelnewbies.org/FAQ
>
>


-- 
Regards,
~Sid~

Reply via email to