如果您从父级发送 SIGTERM,则最终结果取决于调度进程的顺序。
如果孩子首先被安排,一切正常:
+---------------+
| pid = fork(); |
+-------+-------+
parent | child
+-----------------------------+-----------------------------+
| |
| +-------------------------+--------------------------+
| | if (signal(SIGTERM, stopChild) == SIG_ERR) { |
| | printf("Could not attach signal handler\n"); |
| | return EXIT_FAILURE; |
| | } |
| +-------------------------+--------------------------+
| |
. .
. .
. .
| |
+-------------------------+--------------------------+ |
| if (signal(SIGTERM, stopChild) == SIG_ERR) { | |
| printf("Could not attach signal handler\n"); | |
| return EXIT_FAILURE; | |
| } | |
+-------------------------+--------------------------+ |
| |
| |
| |
+-------------+-------------+ |
| if (pid > 0) { | |
| kill(pid, SIGTERM); | |
| } | |
+-------------+-------------+ |
| |
| |
| |
但是如果先安排了paren,则孩子可能没有时间设置信号处理程序:
+---------------+
| pid = fork(); |
+-------+-------+
parent | child
+-----------------------------+-----------------------------+
| |
+-------------------------+--------------------------+ |
| if (signal(SIGTERM, stopChild) == SIG_ERR) { | |
| printf("Could not attach signal handler\n"); | |
| return EXIT_FAILURE; | |
| } | |
+-------------------------+--------------------------+ |
| |
| |
| |
+-------------+-------------+ |
| if (pid > 0) { | |
| kill(pid, SIGTERM); | |
| } | |
+-------------+-------------+ |
| |
. .
. .
. .
| |
| +-------------------------+--------------------------+
| | if (signal(SIGTERM, stopChild) == SIG_ERR) { |
| | printf("Could not attach signal handler\n"); |
| | return EXIT_FAILURE; |
| | } |
| +-------------------------+--------------------------+
| |
| |
| |
这称为竞态条件,因为最终结果取决于谁先跑。