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执行它 ()
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.