繁体   English   中英

"使用 pause() 接收信号后,孩子不会继续运行"

[英]Child doesn't continue running after receiving signal using pause()

  ...

  signal( SIGUSR1, sigusr);
  bla = 0;
  for(;;)
  {
    if(pid=fork()==0)
    {
      fprintf(stderr,"Child %d: Waiting in queue.\n",getpid());
      pause();
      fprintf(stderr,"im here"); //can't get to this line
      kill(deque(q),SIGUSR1)
      _exit(0);
    }
    else
    {
      sem_wait(&q2);
      enque(q,pid);
      sem_post(&q2);
      if(!bla)
      {
        bla=1;
        sem_wait(&q2);
        kill(deque(q),SIGUSR1);
        sem_post(&q2);
      }
      sleep(n);
    }
  }

  ...

void sigusr()
{
  signal(SIGUSR1, sigusr);
  fprintf(stderr, "Child %d: Got it.\n", getpid());
}

表达式pid=fork()==0不能正常工作。 它将fork() == 0的值分配给变量pid ,因为等于的运算符优先级高于赋值的优先级

这意味着pid将为01 ,都不是正确的进程标识符。

改为(pid = fork()) == 0

除了pid=fork()==0还有一个竞态条件,孩子可能在调用pause()之前收到信号,然后在pause()中等待另一个信号。

为避免此问题:

  1. 使用sigprocmask阻止信号。
  2. 检查是否适合等待。
  3. 使用sigsuspend等待信号。
  4. 解锁信号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM