运行需要输入而不挂起的命令,但仍然允许输入
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"
【讨论】:
以上是关于运行需要输入而不挂起的命令,但仍然允许输入的主要内容,如果未能解决你的问题,请参考以下文章