【问题标题】:Linux shell hangs on running multiple instances of an applicationLinux shell 在运行应用程序的多个实例时挂起
【发布时间】:2014-10-15 10:14:57
【问题描述】:

我正在通过 popen() 从 C 程序运行“长笛”(用于发送多播流量的协议)应用程序/二进制文件(我下载的)。这个应用程序有一个特性/错误,它不会在后台运行,因为它使用 shell 来接受一些命令。并且在运行期间,应用程序会锁定外壳。这意味着您只能在 shell 中键入一些预定义的字母,否则您必须等到最后。因此,当我使用 c 代码中的 popen() 运行应用程序的多个实例时,shell 会永久挂起,可能是因为两个应用程序都试图同时使用它(我的假设)。但我可以在不同的 shell 中手动运行多个实例。这是从 C 程序运行它的示例代码。

FILE* pF = popen("./flute -send -a226.0.0.1/6789 /media/song.mp3", "r");

是否有任何解决方案使外壳不会挂起。请帮忙。

【问题讨论】:

    标签: c linux bash shell popen


    【解决方案1】:

    如果进程只是挂起,因为它向您的pF 写入了一个提示并且现在被阻止从继承的标准输入读取,您可以:

    • 将从pF 读取的提示转发到stdout,以便它显示在终端上 - 然后您就会知道何时/输入什么
    • 或手动fork 并拦截stdinstdout:然后提示不会转到您的终端,您的程序可以通过编程方式发送“预定义的字母”

    如果进程挂起是因为它确实在使用继承的终端做某事,您可以为每个子进程创建一个伪终端,这样它们就不会与同一个控制终端混淆。参考this question

    【讨论】:

    • 感谢您的回答。你能解释一下你的第一点吗?我无法正确理解。
    • 从你的 popen FILE* 读取子进程的输出,然后将你得到的任何东西写到 stdout。然后,您将能够在终端上看到子进程正在做什么(或要求)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2015-09-25
    相关资源
    最近更新 更多