簡體   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