运行需要输入而不挂起的命令,但仍然允许输入

Posted

技术标签:

【中文标题】运行需要输入而不挂起的命令,但仍然允许输入【英文标题】:run a command that needs input without hanging, but still allow input 【发布时间】:2016-03-03 20:07:36 【问题描述】:

我正在嵌入式 Linux 平台(英特尔 Edison)上用 C++ 制作一个基本的音乐播放器。

它的工作原理是向 shell 发送命令以使用 mpg123 播放音乐。

播放音乐正常,但现在我需要添加媒体控件。我正在使用mpg123 命令播放我的 MP3 文件,如果您将-C 标志传递给它,那么它会侦听诸如p 用于暂停、q 用于退出等命令

我正在使用其他 SO 答案中的代码来执行命令 How to execute a command and get output of command within C++ using POSIX?

现在的问题是,当我运行命令从 c++(例如mpg123 -C /media/sdcard/Music/<songname>)播放选定的歌曲时,它会挂起 c++ 程序,直到命令返回,直到歌曲播放完毕才返回。我可以通过使用pthead 在并行线程中运行命令来消除该问题,但这仍然不允许我根据需要输入命令。

我想可能以某种方式在另一个tty 中运行命令,然后通过将命令发送到另一个tty 以某种方式将命令传递给mpg123,但我无法找到执行此操作的方法。 (我不确定这是否可能)

我已经尝试了几个小时,所以现在我准备在这里寻求帮助:)

你们中是否有人对如何运行命令而不冻结线程(在 pthread 或其他任何东西中)有任何想法,并且仍然能够向mpg123 发送命令?

【问题讨论】:

所以,您基本上希望P 表示您的mp3 播放器的“暂停”,并且ls -l Private 同时在Private 目录中列出您的文件,而没有@987654336 @ for Private 意思是“暂停”?听起来对我来说是不可能的。但是,是的,您可以使用管道或伪终端将内容从一个进程发送到另一个进程。哪个最有意义实际上取决于您要实现的目标-除了不可能之外。 @MatsPetersson 不太清楚你在说什么。在我使用-C 标志运行mpg123 之后,它会侦听用于命令的输入字符,例如用于暂停的p。我需要找到一种方法来防止命令执行冻结线程,但仍然能够向它发送我的媒体控件的输入字符 【参考方案1】:

听起来你会想要使用 mpg123 的 FIFO 模式。您设置要使用的路径名,将 mpg123 指向它,然后将您的命令回显到其中。

这个answer 有一个很好的例子

FIFO_MPG='/srv/http/newsctl'
mpg123 -R --fifo "$FIFO_MPG"
echo 'load filename.mp3' >> "$FIFO_MPG"

【讨论】:

以上是关于运行需要输入而不挂起的命令,但仍然允许输入的主要内容,如果未能解决你的问题,请参考以下文章

大数据常用shell脚本之fl脚本

Linux命令-nohup

linux 远程主机后台运行任务 挂起脚本

后台运行程序命令备忘

后台运行程序命令备忘

读取大型 JSON 文件而不挂在 Unity 中