可以被一个进程用来终止另一个进程或者一组进程。假如 kill 函数的第一个参数是大于 0 的,那么这个参数将会被认为是目标进程的 pid (进程 ID),假如这个参数是 0 ,则这个参数将会被视作信号发送者所属的那组进程。
kill 的第二个参数要么是一个标准的信号数字(例如 SIGTERM 或 SIGKILL ),要么是 0 ,这将会对信号做一次询问,确认第一个参数中的 pid 是否是有效的。这样优雅地关闭一个多进程应用就可以通过向组成该应用的一组进程发送一个终止信号来完成,具体来说就是调用一个 kill 函数,使得这个调用的第二个参数是 SIGTERM 。(Nginx 主进程可以通过调用 kill 函数来终止其他工人进程,然后再停止自己。)就像许多库函数一样,kill 函数通过一个简单的可变语法拥有更多的能力和灵活性。
示例 3. 一个多进程系统的优雅停止
#include <stdio.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> -
void graceful(int signum) { printf("tChild confirming received signal: %in", signum); puts("tChild about to terminate gracefully..."); sleep(1); puts("tChild terminating now..."); _exit(0); /* fast-track notification of parent */ } -
void set_handler() { struct sigaction current; sigemptyset(¤t.sa_mask); /* clear the signal set */ current.sa_flags = 0; /* enables setting sa_handler, not sa_action */ current.sa_handler = graceful; /* specify a handler */ sigaction(SIGTERM, ¤t, NULL); /* register the handler */ } -
void child_code() { set_handler(); -
while (1) { /` loop until interrupted `/ sleep(1); puts("tChild just woke up, but going back to sleep."); } } -
void parent_code(pid_t cpid) { puts("Parent sleeping for a time..."); sleep(5); -
/* Try to terminate child. */ if (-1 == kill(cpid, SIGTERM)) { perror("kill"); exit(-1); } wait(NULL); /` wait for child to terminate `/ puts("My child terminated, about to exit myself..."); } -
int main() { pid_t pid = fork(); if (pid < 0) { perror("fork"); return -1; /* error */ } if (0 == pid) child_code(); else parent_code(pid); return 0; /* normal */ }
(编辑:成都站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|