【问题标题】:Non-blocking version of system()system() 的非阻塞版本
【发布时间】:2010-11-03 09:40:24
【问题描述】:

我想从我的 c 程序中启动一个进程,但我不想等待该程序完成。我可以使用 system() 启动该过程,但总是等待。有谁知道一旦进程开始就会返回的“非阻塞”版本?

[编辑-附加要求]当原进程执行完毕后,子进程需要继续运行。

【问题讨论】:

  • 我认为system() 是非阻塞的。

标签: c linux operating-system


【解决方案1】:

为什么不使用fork()exec(),干脆不调用waitpid()

例如,您可以执行以下操作:

// ... your app code goes here ...
pid = fork();
if( pid < 0 )
    // error out here!
if( !pid && execvp( /* process name, args, etc. */ )
    // error in the child proc here!
// ...parent execution continues here...

【讨论】:

  • 嗯,似乎对我不起作用。我认为问题可能是我的程序(它是一个 CGI 应用程序)一被称为 execvp 就存在 - 这会杀死子进程吗?另外... execvp 之后的代码似乎正在运行两次。
  • Simon,你能在这里放一个代码示例吗?可能发生的情况是,一旦子进程被分叉,父进程就会退出。您是否按照先生/女士的建议使用了waitpid(chld_pid)?空闲内存?
  • @Simon:如果 execvp() 之后的代码似乎运行了两次,很可能意味着 execvp() 失败并且对其的错误处理并没有阻止事情出错(返回或退出)。在 CGI 程序中,您知道 PATH 设置为什么吗?它可能比你想象的更简朴。
  • 好的,我已经阅读了更多关于 fork() 的内容,现在更好地理解了上面的示例,并且知道为什么某些代码会运行两次。看到发生了什么有点困难,但我认为当原始进程退出时,分叉进程正在被杀死。
  • @Simon:为了让子进程继续存在,你不能捕获 SIGHUP 吗?
【解决方案2】:

您的系统调用中有一个选项,请执行以下操作:

 system("ls -l &");

命令行参数末尾的 & 派生了您已启动的任务。

【讨论】:

    【解决方案3】:

    正常的方法是popen,实际上你不应该再使用system()了。
    这也允许您从衍生进程的标准输入/输出读取或写入

    edit:如果需要读写,请参阅 popen2() -thansk quinmars

    【讨论】:

      【解决方案4】:

      最后,这段代码似乎可以工作。上面的答案有点混搭:

      pid = fork();
      
      if (!pid)
      {
          system("command here &");
      }
      
      exit(0);
      

      不太清楚为什么它会起作用,但它确实符合我的要求,感谢大家的帮助

      【讨论】:

      • 它有效,但它并不是你真正想要做的。 system() 实际上派生了一个 shell 实例,并将您想要执行的命令传递给 shell。所以基本上,你正在做的事情如下:fork(), fork(), execl( "/bin", "sh", "command_to_run &" )。当然,它有效,但它做的工作比它应该做的要多得多。
      • 为什么需要额外的 fork()?你不能只使用 system("... &");打电话?
      【解决方案5】:

      您可以使用posix_spawnp() 函数。它与 system() 非常相似,而不是 fork 和 exec* 组合,但不是阻塞的。

      【讨论】:

        【解决方案6】:

        如果您正在寻找在特定时间后退出的命令,如何使用“超时”命令:

        Ex: system("timeout 5 your command here"); // 如果进程未完成,则在 5 秒内终止命令

        【讨论】:

          猜你喜欢
          • 2011-04-19
          • 1970-01-01
          • 1970-01-01
          • 2011-02-19
          • 1970-01-01
          • 1970-01-01
          • 2016-07-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多