【问题标题】:replace system() with non-blocking function用非阻塞函数替换 system()
【发布时间】:2011-04-19 19:24:49
【问题描述】:

我不想在我的 C 程序中使用 system(),因为 system(3) 会阻塞,这不是我想要的。最好的方法是什么?

【问题讨论】:

标签: c


【解决方案1】:

我认为一个快速而肮脏的动作是调用 sytem(command &)。 & 将产生新的进程。

【讨论】:

  • 绝对+1。 system() 无论如何都是平台相关的。不要用fork() 或类似的东西弄乱你的源代码,而是使用system() 允许你访问的shell。
  • 如果你问我,比 fork 更好的解决方案
【解决方案2】:

使用fork() 创建一个新进程,然后在其中使用system()(或任何exec 函数)。然后原始进程将能够继续执行。

【讨论】:

    【解决方案3】:

    答案取决于您的真正目标是什么。你没有说你在什么平台上,而且我对 Windows 知之甚少,所以这里只涵盖你在 linux/unix 上的选择。

    1. 您只想生成另一个程序,而不需要与之交互。在这种情况下,调用fork(),然后在子进程中运行execve()(或相关函数)。

    2. 您想与另一个程序进行交互。在这种情况下,请使用popen()

    3. 您希望程序的一部分作为子进程运行。在这种情况下,使用fork(),并调用您需要在子进程中运行的任何函数。

    4. 您需要与作为子进程运行的程序的一部分进行交互。调用pipe(),这样你就有一个文件描述符可以通过它进行通信,然后调用fork() 并使用文件描述符对进行通信。或者,您可以通过套接字、消息队列、共享内存等进行通信。

    【讨论】:

    • 手头选项的简要说明,以及如何在它们之间进行选择。
    • fork() 然后 system() 将留下一个无用的进程等待 shell 完成。最好在子进程中调用execve() 或类似名称,而不是system()。如果你想使用 shell 的功能,那么 exec /bin/sh.
    【解决方案4】:

    您可能想使用popen。它会创建新流程并允许您将流程输出重定向到您自己的流程。

    【讨论】:

      【解决方案5】:

      如果在 Windows 中,请使用 Windows API 中的 ShellExecute() 函数。

      如果在 Unix 中,请选择 fork(),然后选择 system(),如上所述。

      【讨论】:

        猜你喜欢
        • 2010-11-03
        • 1970-01-01
        • 2020-03-29
        • 2015-11-15
        • 2019-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多