Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сигналы и isc_detach_database / 4 сообщений из 4, страница 1 из 1
15.07.2019, 16:48
    #39837544
autosoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сигналы и isc_detach_database
Вопрос к знатокам.

Есть такой вот код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <ibase.h>

int fb_error(ISC_STATUS_ARRAY status_vector)
{
    if (status_vector[0] == 1 && status_vector[1])
    {
        isc_print_status(status_vector);
        return -1;
    }
    return 0;
}

int fb_open(char* filename, char* user_name, char* user_password, isc_db_handle *handle)
{
    char dpb_buffer[256], *dpb, *p;
    ISC_STATUS_ARRAY status_vector;
    short dpb_length;
    dpb = dpb_buffer;
    *dpb++ = isc_dpb_version1;
    *dpb++ = isc_dpb_user_name;
    *dpb++ = strlen(user_name);
    for (p = user_name; *p;)
    *dpb++ = *p++;
    *dpb++ = isc_dpb_password;
    *dpb++ = strlen(user_password);
    for (p = user_password; *p;)
    *dpb++ = *p++;
    dpb_length = dpb - dpb_buffer;
    isc_attach_database(status_vector, 0, filename, handle, dpb_length, dpb_buffer);
    return fb_error(status_vector);
}

void fb_close(isc_db_handle *handle)
{
    if (*handle)
    {
        ISC_STATUS_ARRAY status_vector;
        isc_detach_database(status_vector, handle);
        fb_error(status_vector);
    }
}

volatile sig_atomic_t enable = 1;

void stoper(int signum)
{
    enable = 0;
}

int main(void)
{
    isc_db_handle h = 0;

    signal(SIGINT, stoper);

    if (!fb_open("filename.fdb", "user", "password", &h))
    {
        printf("Open\n");
        while (enable) sleep(1);
        printf("Interrupt\n");
        fb_close(&h);
        printf("Close\n");
    }

    printf("Stop\n");

    return 0;
}



По идее программа должна нормально завершаться.

То есть последовательно выводить: "Open", "Interrupt", "Close" и "Stop".

Но выводятся только "Open" и "Interrupt", и нет никаких "Close" и "Stop".

Что я делаю не так и как добиться нормального поведения?
...
Рейтинг: 0 / 0
15.07.2019, 17:09
    #39837553
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сигналы и isc_detach_database
autosoftЧто я делаю не так и как добиться нормального поведения?

Для начала - запрети Firebird обрабатывать SIGINT с помощью fb_shutdown_callback().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.07.2019, 18:18
    #39837583
autosoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сигналы и isc_detach_database
Спасибо.

Нашёл вот тут описание того, как блокировать SIGINT и SIGTERM.

Есть ещё какие-то особенности? Просто фраза "для начала" как-то настораживает)
...
Рейтинг: 0 / 0
15.07.2019, 18:25
    #39837588
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сигналы и isc_detach_database
autosoftПросто фраза "для начала" как-то настораживает)

Когда баги не бросаются в глаза при первом взгляде, это обычно выливается в беганье
кругами и тыканье во все подозрительные норы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сигналы и isc_detach_database / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]