c - Linux shell 在运行一个应用程序的多个实例时挂起

标签 c linux bash shell popen

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

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

有什么解决办法可以让shell不挂。请帮忙。

最佳答案

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

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

如果进程挂起是因为它真的在用继承的终端做一些事情,你可以为每个子进程创建一个伪终端,这样它们就不会搞乱同一个控制终端。参见 this question供引用。

关于c - Linux shell 在运行一个应用程序的多个实例时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26379993/

相关文章:

ios - 在 mac、ios、linux 上使用 calibri 风格

bash - 使用 bash 下载图像直到 url 无效

Linux - 如何在文件名中间添加增量数字?

c - printf(3) 的格式 "positional parameters"是否被视为 ansi C?

objective-c - 如何使用 ASN.1 x509 字节数组中的 RSA 公钥加密字符串?

linux - 向 Linux 中的文件内容添加新值

c - POSIX:您如何确定您自己的进程的文件镜像以便您可以执行自己?

c++ - 如何使用boost program_options读取整数数组?

c - 在c中动态增加数组(int *)的大小

c - Utf8 Linux 文件名和 C