0

端末でコマンドを送信するプログラムを作成しています:

cmus-remote -Q

出力:

status stopped
set aaa_mode album
set continue false
set play_library true
set play_sorted false
set replaygain disabled
set replaygain_limit true
set replaygain_preamp 6.000000
set repeat false
set repeat_current false
set shuffle false
set softvol false
set vol_left 0
set vol_right 0

このコマンドは、ミュージック プレーヤーのステータスを返します ( cmus) が、プレーヤーが閉じていて、コマンドに応答しない場合があります。

私の目的は、いつ答えが得られなかったのかを特定し、プログラムを閉じて、(C++ で) 再度開くことです。私はそれを殺してやり直す方法を知っています。機能のあるものを試してみましたpopen()が、使い方がわかりません。どうやってやるの?

4

2 に答える 2

0

C++ でコンパイルできる C 関数に関して (ヘッダーに適切な変更を加え、必要に応じて を追加しusing namespace std;て)。プレーヤーが実行されているときのステータス メッセージが何であるかを確認する必要がありますcmus-remote -Q— 「ステータス準備完了」と仮定しましたが、複数の応答 (「ステータス再生中」、「ステータス一時停止」など) がある場合は、「コードを適切に変更する必要があります。また、応答の最初の行のみが必要であると想定しています。繰り返しますが、それが間違っている場合は、コードに結果的な変更を加える必要があります。

bool is_cmus_running(void)
{
    char buffer[4096];
    FILE *fp = popen("cmus-remote -Q", "r");
    if (fp == 0)
        return false;
    char *rv = fgets(buffer, sizeof(buffer), fp);
    pclose(fp);
    if (rv == 0 || strncmp(buffer, "status ready", sizeof("status ready") - 1) != 0)
        return false;
    return true;
}

C99 の場合、次のものが必要です。

#include <stdbool.h>
#include <stdio.h>
#include <string.h>

C++ の場合、同じヘッダーを使用できると思いますが、以下も使用できます。

#include <cstdio>
#include <cstring>
using namespace std;

bool( C にはない方法で C++ に組み込まれているため、ヘッダーは必要ありません。)

于 2013-09-10T20:00:31.570 に答える
0

(1) C++ に固執する特別な理由がない限り、私はもっと簡単な方法でそれを行います。基本的なシェル スクリプトは、cplayスクリプト ( https://wiki.archlinux.org/index.php/Cmus#Remote_Control )のようなもので、完全に機能します。

$ ps h -C cmus || cmus

Cmus は実際のバックグラウンド サービスではないため、たとえば、ncurses GUI なしでは起動できません。これは、screen セッションで実行している場合に最適です。

$ screen -rD cmus || screen -dmS 'cmus' /usr/bin/cmus

このコマンドを使用すると、screen セッション内で常に cmus セッションが実行されます。ターミナルを閉じても、サービスはバックラウンドで実行され続けます。このコマンドを .bashrc にエイリアスとして追加するだけで、いつでもプレーヤーに簡単にアクセスできます

$ alias mycmus='screen -rD cmus || screen -dmS 'cmus' /usr/bin/cmus'

実行されていない場合は cmus+screen セッションを開始し、そうでない場合はセッションを開きます。「Ctrl+a d」はウィンドウを切り離します。

それらをまとめて質問に答えます(シェルスクリプトで):

次の行をファイルに追加します。例: " mycplayer.sh" ( を忘れずにPATHchmod +x mycplayer.shに追加してください)

#!/bin/sh

cmus-remote -Q > /dev/null || screen -dmS 'cmus' /usr/bin/cmus

cmus-remote $1

最初の行は実行中の cmus インスタンスがあることを確認し (バックグラウンドで screen を使用)、2 行目はリモート コマンドを実行します。

使用法:

$ mycplayer.sh -u   start/stop the player
$ mycplayer.sh -n   next in the playlist
etc.

(2) C++の場合

(3)cmusがネットワーク サービスであり、 で開始されている場合--listen host[:port]、リモート ボックスでサービスを開始するには ssh が必要です。上記の画面コマンドを参照してください。

お役に立てれば。

于 2013-09-10T23:06:39.310 に答える