Я пишу плагин для своей строки состояния для печати состояния MPD, в настоящее время использую библиотеку libmpdclient. Он должен быть надежным, чтобы правильно обрабатывать потерянные соединения в случае перезапуска MPD, но простая проверка с помощью mpd_connection_get_error
на существующих Объект mpd_connection не работает, он может обнаружить ошибку только в случае сбоя исходного mpd_connection_new
.
Это упрощенный код, с которым я работаю:
#include <stdio.h>
#include <unistd.h>
#include <mpd/client.h>
int main(void) {
struct mpd_connection* m_connection = NULL;
struct mpd_status* m_status = NULL;
char* m_state_str;
m_connection = mpd_connection_new(NULL, 0, 30000);
while (1) {
// this check works only on start up (i.e. when mpd_connection_new failed),
// not when the connection is lost later
if (mpd_connection_get_error(m_connection) != MPD_ERROR_SUCCESS) {
fprintf(stderr, "Could not connect to MPD: %s\n", mpd_connection_get_error_message(m_connection));
mpd_connection_free(m_connection);
m_connection = NULL;
}
m_status = mpd_run_status(m_connection);
if (mpd_status_get_state(m_status) == MPD_STATE_PLAY) {
m_state_str = "playing";
} else if (mpd_status_get_state(m_status) == MPD_STATE_STOP) {
m_state_str = "stopped";
} else if (mpd_status_get_state(m_status) == MPD_STATE_PAUSE) {
m_state_str = "paused";
} else {
m_state_str = "unknown";
}
printf("MPD state: %s\n", m_state_str);
sleep(1);
}
}
Когда MPD останавливается во время выполнения вышеуказанной программы, он выдает ошибку segfault:
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00007fb2fd9557e0 in mpd_status_get_state () from /usr/lib/libmpdclient.so.2
Единственный способ, который я могу придумать, чтобы сделать программу безопасной, — это устанавливать новое соединение на каждой итерации, чего я надеялся избежать. Но что делать, если связь между отдельными вызовами libmpdclient
функций теряется? Как часто и, что более важно как именно, я должен проверять, живо ли соединение?