我正在创建一个在终端上发送命令的程序:
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()函数,但我不知道如何使用它。我该怎么做呢?
发布于 2013-09-11 04:00:32
关于可以用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-11 07:06:39
(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使用此命令,在screen会话中始终有一个正在运行的cmus会话。你甚至可以关闭终端,服务将继续在后台运行。只需将此命令作为别名放到您的.bashrc中,您就可以轻松访问播放器
$ alias mycmus='screen -rD cmus || screen -dmS 'cmus' /usr/bin/cmus'如果cmus+screen会话未运行,将启动该会话,否则将打开该会话。"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实例(在后台使用screen),第二行将执行远程命令。
用法:
$ mycplayer.sh -u start/stop the player
$ mycplayer.sh -n next in the playlist
etc.(2) C++中的
(3)如果cmus是一个网络服务,所以它是用--listen host[:port]启动的,那么您将需要一个ssh来启动远程计算机上的服务。请看上面的screen命令怎么做。
希望这能有所帮助。
https://stackoverflow.com/questions/18727060
复制相似问题