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

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

本文关键字:输入 许输入 命令 挂起 运行      更新时间:2023-10-16

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

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

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

我正在使用另一个 SO 答案中的代码来执行命令如何使用 POSIX 执行命令并在C++内获取命令输出?

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

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

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

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

听起来

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

这个答案有一个很好的例子

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