kill signal example

谁说胖子不能爱 提交于 2019-12-04 08:36:39

Your code has a major race condition. You do not ensure that the child has finished calling signal before the parent sends the signals. You either need to use some kind of synchronization primitive to make the parent wait for the child to install the handlers, or you need to install the signal handlers before forking so the child inherits them.

Here's the easiest way I know to synchronize processes like this:

  1. Before forking, call pipe(p) to create a pipe.
  2. fork().
  3. In the parent, close(p[1]); (the writing end) and read(p[0], &dummy, 1);
  4. In the child, close(p[0]); and close(p[1]); after installing the signal handlers.
  5. When the parent returns from read, you can be sure the child has setup its signal handlers. You can also close(p[0]); in the parent at this point.

Edit 2: Perhaps a better and easier approach:

  1. Before forking, call sigprocmask to block all signals and save the old signal mask.
  2. In the parent, call sigprocmask again right after forking to restore the original signal mask.
  3. In the child, call sigprocmask right after installing the signal handlers to restore the original signal mask.

You should use getpid() instead of pid().

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!