【发布时间】:2011-04-21 21:19:19
【问题描述】:
我需要拦截重启或关机。程序是这样的:
void sig_handler(int sig) {
if (sig == SIGTERM) {
/* do something */
}
}
int main() {
....
signal(SIGTERM, sig_handler);
/* daemon */
pid = fork();
if (pid > 0) exit(EXIT_SUCCESS);
// I didn't do setsid() to retain process group id.
....
}
当我通过“kill -15”进行测试时,这有效。但是,当我尝试“重启”或“关机”命令时,它从未收到信号。初始化手册页说:
"当请求 init 更改运行级别时,它会向所有未在新运行级别中定义的进程发送警告信号 SIGTERM。然后等待 5 秒,然后通过 SIGKILL 信号强制终止这些进程。请注意,init 假设“
如何告诉 init 守护进程发送 SIGTERM 给这个程序?我的猜测是我应该将进程组 ID 设置为 init 知道的东西,但我该怎么做呢?
【问题讨论】: