C++ 如何检测命令是否未响应

C++ 如何检测命令是否未响应,c++,terminal,command,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_curr

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

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
此命令返回我的音乐播放器的状态(
CMU
),但有时播放器已关闭且不响应我的命令

我的目标是确定什么时候我没有得到答案,然后关闭程序并再次打开它(在C++中)。我知道如何杀死它,然后重新开始。我试着用
popen()
函数做些什么,但我不知道如何使用它。
我如何做到这一点?< /P> < P>,C++函数可以用C++编译(对标题进行适当的更改,并使用命名空间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;
#包括
#包括
使用名称空间std;

(C.代码不需要一个头,因为Boo.<代码),它是以C++的方式,而不是在你的方式)< < /P> < P> <强>(1)< /强> 我会用一种更简单的方式来做,除非有一个特定的理由来坚持C++。一个基本的shell脚本将完美地完成这项工作,类似于

cplay
script():

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

$ screen -rD cmus || screen -dmS 'cmus' /usr/bin/cmus
使用此命令,在屏幕会话中始终有一个正在运行的CMU会话。您甚至可以关闭终端,该服务将在后台继续运行。只需将此命令作为别名放到.bashrc中,就可以轻松访问该播放器

$ alias mycmus='screen -rD cmus || screen -dmS 'cmus' /usr/bin/cmus'
如果没有运行,将启动CMU+屏幕会话,否则将打开会话。“Ctrl+a d”可分离窗口

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

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

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

用法:

$ mycplayer.sh -u   start/stop the player
$ mycplayer.sh -n   next in the playlist
etc.
(2)在C中++

  • 检查是否有用于CMU的插座 /home/user/.cmus/socket

  • 如果没有进程运行,则使用exec+fork执行它 ()

(3)如果
CMU
是一项网络服务,因此它是通过
--侦听主机[:端口]
启动的,那么您需要ssh来启动远程机箱上的服务。请参阅上面的屏幕命令,了解如何执行此操作


希望这有帮助。

欢迎使用堆栈溢出。请尽快阅读这一页。启动
cmus
服务时,是否运行
cmus
命令?这就是你想从剧本中做的吗?或者您想运行
cmus remote-Q
命令并读取输出,如果它以
status stopped
开头,则运行
cmus
命令?如果是后者,那么
FILE*fp=popen(“cmus remote-Q”,“r”)有什么问题:
给你一个文件流,如果命令被执行,你可以从中读取?Thx是快速答案。我会详细解释。我的cmu在另一台计算机上运行,我从我的计算机控制它,当链接断开时,它们通过链接连接,我没有从cmusremote-Q得到任何回答。我想发送“cmusremote-Q”命令并检测它是否没有得到回答,这样我就可以重新启动cmus程序。
#!/bin/sh

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

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