首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测命令是否未得到响应

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

Stack Overflow用户
提问于 2013-09-11 03:13:23
回答 2查看 124关注 0票数 0

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

代码语言:javascript
复制
cmus-remote -Q

输出:

代码语言:javascript
复制
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()函数,但我不知道如何使用它。我该怎么做呢?

EN

回答 2

Stack Overflow用户

发布于 2013-09-11 04:00:32

关于可以用C++编译的C函数(适当地修改头文件并在适当的情况下添加using namespace std; )。当播放器运行时,你需要检查来自cmus-remote -Q的状态消息是什么-我假设是“状态就绪”,但如果有多个响应(“状态播放”,“状态暂停”,...)然后,您需要适当地修改代码。我还假设您只需要响应的第一行。同样,如果这是错误的,您将不得不对代码进行相应的更改。

代码语言:javascript
复制
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,您需要:

代码语言:javascript
复制
#include <stdbool.h>
#include <stdio.h>
#include <string.h>

对于C++,我认为您可以使用相同的标头,但您也可以使用:

代码语言:javascript
复制
#include <cstdio>
#include <cstring>
using namespace std;

(您不需要bool的标头,因为它是以一种不是C语言的方式内置于C++中的。)

票数 0
EN

Stack Overflow用户

发布于 2013-09-11 07:06:39

(1)除非有特别的理由坚持使用C++,否则我会用一种更简单的方法。一个基本的shell脚本就可以很好地完成这项工作,类似于cplay脚本(https://wiki.archlinux.org/index.php/Cmus#Remote_Control):

代码语言:javascript
复制
$ ps h -C cmus || cmus

因为Cmus不是真正的后台服务,-例如。如果没有ncurses GUI,则无法启动它-如果在屏幕会话中运行它,效果最好。

代码语言:javascript
复制
$ screen -rD cmus || screen -dmS 'cmus' /usr/bin/cmus

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

代码语言:javascript
复制
$ alias mycmus='screen -rD cmus || screen -dmS 'cmus' /usr/bin/cmus'

如果cmus+screen会话未运行,将启动该会话,否则将打开该会话。"Ctrl+a d“可分离窗口。

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

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

代码语言:javascript
复制
#!/bin/sh

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

cmus-remote $1

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

用法:

代码语言:javascript
复制
$ mycplayer.sh -u   start/stop the player
$ mycplayer.sh -n   next in the playlist
etc.

(2) C++中的

  • 使用stat(2)检查如果存在用于cmus的套接字没有正在运行的进程,请使用exec+fork
  • 执行它

(3)如果cmus是一个网络服务,所以它是用--listen host[:port]启动的,那么您将需要一个ssh来启动远程计算机上的服务。请看上面的screen命令怎么做。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18727060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档