我用 C 语言编写了一个守护进程,它使用libpq库将数据发布到 PostgreSQL 数据库。它有这样的结构:
init(...) // init function, opens connection
while(1){export(...)} // sends commands
当有人杀死应用程序时,它会在 PostgreSQL 服务器上留下开放连接。我想避免这种情况。在 export(...) 函数中打开和关闭连接不是一个选项,因为此代码是性能相关框架的一部分。
我用 C 语言编写了一个守护进程,它使用libpq库将数据发布到 PostgreSQL 数据库。它有这样的结构:
init(...) // init function, opens connection
while(1){export(...)} // sends commands
当有人杀死应用程序时,它会在 PostgreSQL 服务器上留下开放连接。我想避免这种情况。在 export(...) 函数中打开和关闭连接不是一个选项,因为此代码是性能相关框架的一部分。
您可以安装一个信号处理程序来捕获应用程序终止,并关闭来自该处理程序的活动连接:
#include "signal.h"
#include "stdio.h"
#include "stdlib.h"
void catch_sigint( int sig )
{
/* Close connections */
/*
* The software won't exit as you caught SIGINT
* so explicitly close the process when you're done
*/
exit( EXIT_SUCCESS );
}
int main( void )
{
/* Catches SIGINT (ctrl-c, for instance) */
if( signal( SIGINT, catch_sigint ) == SIG_ERR )
{
/* Failed to install the signal handler */
return EXIT_FAILURE;
}
/* Perform your operations */
while( 1 );
return EXIT_SUCCESS;
}
您必须为可能终止程序的信号实现处理程序。
void handler_function(int signal) {
//close db connection
exit(signal);
}
// somewhere in init:
{
sigset_t sigs;
struct sigaction siga_term;
sigfillset( &sigs );
siga_term.sa_handler = handler_funciton();
siga_term.sa_mask = sigs;
siga_term.sa_flags = 0;
sigaction( SIGTERM, &siga_term, NULL );
}