1

現在libmpdclientライブラリを使用して、MPD 状態を出力するステータスバーのプラグインを作成しています。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 が停止すると、次のようにセグメンテーション違反が発生します。

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007fb2fd9557e0 in mpd_status_get_state () from /usr/lib/libmpdclient.so.2

プログラムを安全にするために考えられる唯一の方法は、反復ごとに新しい接続を確立することですが、これは避けたいと思っていました。libmpdclientしかし、個々の関数呼び出し間で接続が失われた場合はどうなるでしょうか? どのくらいの頻度で、さらに重要なことに、接続がまだ有効かどうかをどのくらい正確に確認する必要がありますか?

4

2 に答える 2