Как закрыть инициализированные связи, когда программа закончена пользователем

Я пишу демону в C, который отправляет данные к использованию базы данных PostgreSQL libpq библиотека. У этого есть структура как это:

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

Когда кто-то убивает применение, оно оставляет открытую связь на сервере PostgreSQL. Я хочу избежать этого. Открытие и заключительная связь в экспорте (...) функционирует, не выбор, потому что этот код - часть исполнительной структуры иждивенца.

0
nl ja de

2 ответы

Можно установить укладчик сигнала, чтобы поймать применение убивают и закрывают активные связи от того укладчика:

#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;
}
1
добавлено
Неправильно! сигнал является ISO-C и sigaction , является POSIX. Так сигнал на самом деле более портативный. Но я согласовываю it' s старый путь, у которых есть меньше вариантов, чем sigaction . Но также и отметьте, чем на большинстве фактических систем POSIX, , который сигнал на самом деле осуществляется, используя sigaction . Я использовал сигнал в моем ответе, поскольку OP не упоминал свою платформу, таким образом, пример будет бежать даже на не системы POSIX.
добавлено автор Macmade, источник
Использование сигнал() не рекомендуется как не портативное. Его использования нужно избежать. sigaction() , при наличии, является предпочтительным решением.
добавлено автор alk, источник
Я shouldn' t написали" ... портативный... ", упоминая функцию POSIX как альтернативу, вы правы (хотя я добавил" ... при наличии... " правовая оговорка, btw). Так или иначе, даже будучи ISO-C, это не удостоверяется каждый сигнал() ' s внедрения ведут себя подобные.
добавлено автор alk, источник

Необходимо осуществить укладчика для сигналов, которые могли закончить программу.

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

consult how to intercept linux signals ? (in C)

1
добавлено
pgsql – PostgreSQL
pgsql – PostgreSQL
2 429 участник(ов)

Чат про PostgreSQL

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.