'kill -9 process ID' 信号处理程序
'kill -9 process ID' signal handler
我开发了一个程序,它在http 服务器中使用tcp 套接字与客户端进行通信。
我使用以下代码创建 http 服务器:
void http_server_init(void)
{
struct sockaddr_in server;
int cr_port;
for(;;) {
cr_port = conf.port;
int i = (DEFAULT_PORT == cr_port)? 1 : 0;
//Create socket
cr_socket_desc = socket(AF_INET , SOCK_STREAM , 0);
if (cr_socket_desc == -1)
{
LOG (ERROR,"Could not open server socket, Error no is : %d, Error description is : %s", errno, strerror(errno));
sleep(1);
continue;
}
/* enable SO_REUSEADDR */
int reusaddr = 1;
if (setsockopt(cr_socket_desc, SOL_SOCKET, SO_REUSEADDR, &reusaddr, sizeof(int)) < 0) {
LOG (WARNING,"setsockopt(SO_REUSEADDR) failed");
}
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
for(;;i++) {
server.sin_port = htons(cr_port);
//Bind
if( bind(cr_socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
{
//print the error message
LOG (ERROR,"Could not bind server socket on the port %d, Error no is : %d, Error description is : %s", cr_port, errno, strerror(errno));
cr_port = DEFAULT_PORT + i;
LOG (INFO,"Trying to use another port: %d", cr_port);
continue;
}
break;
}
break;
}
LOG (INFO,"server initiated with the port: %d", cr_port);
}
然后在程序退出时关闭套接字。
如果我的程序正常停止,我使用套接字关闭功能(/etc/init.d/myprog stop)
close(cr_socket_desc);
但是当我用 kill -9 PID of my program
停止我的程序时,我使用以下代码:
void signal_handler(int signal_num)
{
close(cr_socket_desc);
_exit;
}
void main()
{
....
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = signal_handler;
sigaction(SIGINT, &act, 0);
sigaction(SIGTERM, &act, 0);
sigaction(SIGKILL, &act, 0);
sigaction(SIGSTOP, &act, 0);
......
}
但是套接字没有关闭,因为它被另一个服务占用了。
问题是如何处理 kill -9
信号以及如何捕获它?
您无法捕捉或忽略这些信号,
SIGKILL and SIGSTOP
因此,为此您可以使用 sigprocmask()
.
来阻止该信号
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
Kill -9 发送一个 SIGKILL,您无法捕捉或忽略它。 (参见 http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html)。
您也不能使用 sigprocmask() 来阻止 SIGKILL。任何这样做的尝试都将被忽略。
您无法捕获这些 SIGKILL 的事实意味着您的程序在收到 SIGKILL 时将永远没有机会 运行 任何代码。 SIGKILL 是 OS 以极端偏见终止您的进程的一种方式。
你没有说明你为什么使用 kill -9 来终止你的进程。如果这是你自己做的事情,你应该尝试发送一个不同的信号(SIGTERM 会很好,这是 kill 默认发送的,没有任何参数指定不同的信号编号)。这将调用您的信号处理程序并允许您干净地关闭套接字。
如果你的程序真的卡住了,你真的需要使用 kill -9 来摆脱它,根本就没有办法执行任何干净的关机。
我开发了一个程序,它在http 服务器中使用tcp 套接字与客户端进行通信。 我使用以下代码创建 http 服务器:
void http_server_init(void)
{
struct sockaddr_in server;
int cr_port;
for(;;) {
cr_port = conf.port;
int i = (DEFAULT_PORT == cr_port)? 1 : 0;
//Create socket
cr_socket_desc = socket(AF_INET , SOCK_STREAM , 0);
if (cr_socket_desc == -1)
{
LOG (ERROR,"Could not open server socket, Error no is : %d, Error description is : %s", errno, strerror(errno));
sleep(1);
continue;
}
/* enable SO_REUSEADDR */
int reusaddr = 1;
if (setsockopt(cr_socket_desc, SOL_SOCKET, SO_REUSEADDR, &reusaddr, sizeof(int)) < 0) {
LOG (WARNING,"setsockopt(SO_REUSEADDR) failed");
}
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
for(;;i++) {
server.sin_port = htons(cr_port);
//Bind
if( bind(cr_socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
{
//print the error message
LOG (ERROR,"Could not bind server socket on the port %d, Error no is : %d, Error description is : %s", cr_port, errno, strerror(errno));
cr_port = DEFAULT_PORT + i;
LOG (INFO,"Trying to use another port: %d", cr_port);
continue;
}
break;
}
break;
}
LOG (INFO,"server initiated with the port: %d", cr_port);
}
然后在程序退出时关闭套接字。
如果我的程序正常停止,我使用套接字关闭功能(/etc/init.d/myprog stop)
close(cr_socket_desc);
但是当我用 kill -9 PID of my program
停止我的程序时,我使用以下代码:
void signal_handler(int signal_num)
{
close(cr_socket_desc);
_exit;
}
void main()
{
....
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = signal_handler;
sigaction(SIGINT, &act, 0);
sigaction(SIGTERM, &act, 0);
sigaction(SIGKILL, &act, 0);
sigaction(SIGSTOP, &act, 0);
......
}
但是套接字没有关闭,因为它被另一个服务占用了。
问题是如何处理 kill -9
信号以及如何捕获它?
您无法捕捉或忽略这些信号,
SIGKILL and SIGSTOP
因此,为此您可以使用 sigprocmask()
.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
Kill -9 发送一个 SIGKILL,您无法捕捉或忽略它。 (参见 http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html)。
您也不能使用 sigprocmask() 来阻止 SIGKILL。任何这样做的尝试都将被忽略。
您无法捕获这些 SIGKILL 的事实意味着您的程序在收到 SIGKILL 时将永远没有机会 运行 任何代码。 SIGKILL 是 OS 以极端偏见终止您的进程的一种方式。
你没有说明你为什么使用 kill -9 来终止你的进程。如果这是你自己做的事情,你应该尝试发送一个不同的信号(SIGTERM 会很好,这是 kill 默认发送的,没有任何参数指定不同的信号编号)。这将调用您的信号处理程序并允许您干净地关闭套接字。
如果你的程序真的卡住了,你真的需要使用 kill -9 来摆脱它,根本就没有办法执行任何干净的关机。