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

run a command that needs input without hanging, but still allow input

我正在嵌入式 Linux 平台 (Intel 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++ 程序,直到命令 returns,这不会 return 直到歌曲播放完毕。我可以通过在并行线程中使用 pthead 到 运行 命令来消除该问题,但这仍然不允许我根据需要输入命令。

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

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

你们有没有关于如何在不冻结线程(在 pthread 或其他什么中)的情况下 运行 命令,并且仍然能够向 mpg123 发送命令的想法?

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

这个answer有一个很好的例子

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