2013-01-09 4 views
0

libpq 라이브러리를 사용하여 PostgreSQL 데이터베이스에 데이터를 게시하는 데몬을 C에 작성합니다. 그것은 다음과 같은 구조를 가지고 :사용자가 프로그램을 종료 할 때 초기화 된 연결을 닫는 방법

init(...) // init function, opens connection 
while(1){export(...)} // sends commands 

사람이 응용 프로그램을 죽이고 때, PostgreSQL 서버에 열려있는 연결을 떠난다. 나는 그것을 피하고 싶다. 내보내기 (...) 함수의 열기 및 닫기 연결은이 코드가 성능 종속 프레임 워크의 일부이기 때문에 옵션이 아닙니다.

답변

1

당신은 응용 프로그램 킬을 잡으려고 signal handler를 설치할 수 있습니다, 그 핸들러에서 활성 연결을 닫습니다 : 당신은 당신의 프로그램을 종료 할 수 신호 처리기를 구현해야

#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; 
} 
+0

신호 '의 사용()'휴대하지 권장되지 상담. 그 사용은 피해야합니다. 가능한 경우'sigaction()'이 선호되는 해결책입니다. – alk

+0

틀렸어! 'signal'은 ISO-C이고'sigaction'은 POSIX입니다. 따라서 '신호'는 사실 더 휴대 가능합니다. 그러나 그것은 'sigaction'보다 적은 옵션을 가진 오래된 방법이라는 데 동의합니다. 그러나 대부분의 실제 POSIX 시스템보다 주목할 만하게도,'signal '은 실제로'sigaction'을 사용하여 구현됩니다. OP가 플랫폼을 언급하지 않았기 때문에 대답이 'signal'로 사용되었으므로 예제는 POSIX가 아닌 시스템에서도 실행됩니다. – Macmade

+0

필자는 "* ... portable ... *"라고 쓰지 말았어야했습니다. POSIX 함수를 대안으로 언급 할 때, 당신이 옳았습니다. ("* if available ... * disclaimer, btw) . 어쨌든, ISO-C 일지라도, 이것은 각각의 signal()의 구현이 비슷하게 작동 하는지를 확인하지는 않는다. – alk

1

.

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); 
} 

how to intercept linux signals ? (in C)