Странное рекурсивное поведение с использованием XCB - PullRequest
0 голосов
/ 08 ноября 2018

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

#include <stdio.h>
#include <xcb/xcb.h>

int i = 0;

int connect(xcb_connection_t** conn) {
    xcb_connection_t* try_conn = xcb_connect(NULL, NULL);
    int status = 0;
    int conn_status = xcb_connection_has_error(try_conn);
    if (conn_status != 0) {
        i = i + 1;
        switch (conn_status) {
            case XCB_CONN_ERROR:
                printf("Error connecting to the X Server, try %d\n", i);
                break;
            case XCB_CONN_CLOSED_EXT_NOTSUPPORTED:
                printf("Connection closed, extension not supported\n");
                break;
            case XCB_CONN_CLOSED_MEM_INSUFFICIENT:
                printf("Connection closed, memory insufficient\n");
                break;
            case XCB_CONN_CLOSED_REQ_LEN_EXCEED:
                printf("Connection closed, required length exceeded\n");
                break;
            case XCB_CONN_CLOSED_PARSE_ERR:
                printf("Connection closed, parse error\n");
                break;
            case XCB_CONN_CLOSED_INVALID_SCREEN:
                printf("Connection closed, invalid screen\n");
                break;
            default:
                printf("Connection failed with unknown cause\n");
                break;
        }

        status = 1;
    } else {
        *conn = try_conn;
        status = 0;
    }

    return status;
}

int main() {
    xcb_connection_t* conn = NULL;
    if (connect(&conn) != 0) {
        printf("Error connecting to the X Server\n");
        return -1;
    }

    return 0;
}

Он печатает строку, которая говорит Error connecting the the X Server, try %d\n 8191 раз каждый раз, когда я запускаю программу. Когда я смотрю на то, что происходит с GDB, кажется, что каждый раз, когда я вызываю xcb_connect, мой код входит в эту глубокую рекурсию (например, в тысячи кадров глубиной) между xcb_connect_to_display_with_auth_info() и моей connect() функцией.

Что меня действительно смущает, так это то, как xcb_connect_to_display_with_auth_info() может вообще вызывать мою connect() функцию, потому что она из отдельной библиотеки, и я не передал указатель на свою функцию. Мой код выглядит так, как будто его поведение должно быть полностью «линейным», но это совсем не так.

Я тестирую оконный менеджер, запустив Xephyr с именем X-сервера :1 и установив DISPLAY в :1 перед запуском программы.

Я немного новичок в XCB и C, так что, возможно, я упускаю что-то явно очевидное, но я был бы признателен за любые указания. До сих пор я искал вдохновение в hootwm.

1 Ответ

0 голосов
/ 20 ноября 2018

Вы переопределяете функцию connect библиотеки C. XCB вызывает эту функцию для подключения к серверу X11, но вместо этого заканчивает вызовом этой функции. https://linux.die.net/man/2/connect

Один из возможных выходов из этого (помимо присвоения вашей функции другого имени) - сделать ее static.

...