如何检测命令是否未得到应答

时间:2013-09-10 19:13:23

标签: c++ terminal command

我正在创建一个在终端上发送命令的程序:

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()函数,但我不知道如何使用它。 我怎么能这样做?

2 个答案:

答案 0 :(得分: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 ++中。)

答案 1 :(得分:0)

<强>(1) 我会以更简单的方式做到这一点,除非有特定的理由坚持使用C ++。基本的shell脚本可以完美地完成工作,例如cplay脚本(https://wiki.archlinux.org/index.php/Cmus#Remote_Control):

$ ps h -C cmus || cmus

由于Cmus不是真正的后台服务,例如。没有ncurses GUI就无法启动它 - 如果你在屏幕会话中运行它,那就最好了。

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

使用此命令,您始终在屏幕会话中运行cmus会话。你甚至可以关闭终端,服务将在后台继续运行。只需将此命令作为别名放入.bashrc,您就可以轻松访问播放器

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

如果没有运行,将启动cmus +屏幕会话,否则会打开会话。 “Ctrl + a d”分离窗口。

将它们放在一起并回答你的问题(在shell脚本中):

将以下行添加到文件中,例如:“mycplayer.sh” (不要忘记chmod +x mycplayer.sh,然后将其添加到路径

#!/bin/sh

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

cmus-remote $1

第一行将确保有一个正在运行的cmus实例(在后台,使用屏幕),第二行将执行远程命令。

用法:

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

(2)在C ++中

(3)如果cmus是网络服务,那么它是以--listen host[:port]启动的,那么您需要一个ssh来启动远程服务器上的服务。请参阅上面的屏幕命令如何操作。

希望这有帮助。