powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сигналы и isc_detach_database
4 сообщений из 4, страница 1 из 1
Сигналы и isc_detach_database
    #39837544
autosoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос к знатокам.

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

Код: 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
Сигналы и isc_detach_database
    #39837553
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
autosoftЧто я делаю не так и как добиться нормального поведения?

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

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

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

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


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