繁体   English   中英

收到信号后子进程仍然不运行

[英]Child process still does not run after receiving signal

该代码是对此问题的答案之一。

#include<stdio.h>
#include<unistd.h>
#include<signal.h>


void
sigusr1( int pidno )
{
  fprintf(stderr, "Caught\n");
}

int
main()
{
  pid_t pid;

  signal( SIGINT, sigusr1 );
  if( (pid = fork()) == 0 ){
    pause();
    fprintf(stderr, "Child\n");
  }
  else
  {
    fprintf(stderr, "Parent\n");
    kill( pid , SIGINT ); //parent sends signal to child
  }
  pause();
  return 0;
}

子进程等待信号,并在接收到信号后继续执行。

运行它我得到

Parent
Caught

似乎孩子在收到信号后没有跑动。 按Ctrl + c:

Parent
Caught
^CCaught
Caught
Child

有人可以解释一下这里发生了什么吗?

子级收到并处理信号 ,将调用pause()。 不幸的是, pause()容易引入这种竞争条件

time you parent                   child
---- --- ------                   -----
  0      signal(SIGINT,handler)
  1      fork()                   (hello)
  2      print("Parent")          (waking up)
  3      kill(..., SIGINT)        <<SIGINT>>               # RACE kill v pause
  4                               handler: print("Caught")
  5      pause()                  pause()
  6   ^C <<SIGINT>>               <<SIGINT>>
  7      handler: print("Caught") handler: print("Caught")
  8      exit                     pause()
  9                               (still running)

要检查到底发生了什么,请尝试将%i,getpid()添加到printfs,还可能在子分支中的pause()调用之前再添加一个printf()。

sigsuspend()和显式信号屏蔽可能是一个更好的选择。

暂无
暂无

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

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