C Linux shell挂起运行应用程序的多个实例

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

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

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

有没有什么解决办法使外壳不会挂起。请提供帮助。

如果进程因为向您的
pF
写入提示而挂起,并且现在被阻止从继承的stdin读取,您可以:

  • 将读取的提示从
    pF
    转发到
    stdout
    ,使其显示在终端上,这样您就知道何时/何时键入
  • 或者手动
    fork
    并截取
    stdin
    stdout
    :这样提示符就不会进入您的终端,您的程序就可以通过编程方式发送“预定义字母”

如果进程挂起是因为它确实在对继承的终端执行某些操作,那么可以为每个子进程创建一个伪终端,这样它们就不会与同一个控制终端发生冲突。请参阅以供参考。

谢谢您的回答。你能稍微解释一下你的第一点吗?我无法正确理解它。请从popen
文件*
中读取子进程的输出,然后将所有内容写入
stdout
。然后,您将能够看到子进程在终端上正在做(或请求)什么。