현재 상태 저장소에 libmpdclient 라이브러리를 사용하는 MPD 상태를 인쇄하기위한 플러그인을 작성하고 있습니다. MPD가 다시 시작될 경우 손실 된 연결을 올바르게 처리하려면 견고해야하지만 기존 mpd_connection 개체에 대한 mpd_connection_get_error
의 간단한 검사는 작동하지 않습니다. – mpd_connection_new
이 실패 할 때만 오류를 감지 할 수 있습니다. libmpdclient : MPD 데몬과의 연결이 끊어 졌음을 감지하십시오.
이
나는과 단순화 된 코드 일하고있다 :#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
함수에 대한 개별 호출간에 연결이 끊어지면 어떻게해야합니까? 얼마나 자주, 그리고 더 중요한 것은 정확히 어떻게, 내가 연결이 아직 살아 있는지 확인해야합니까?