有没有办法不等待system()命令完成? (在c中)

时间:2011-08-05 20:21:06

标签: c++ c system call hang

  

类似于:
  program not executing anything after a call to system()
  

我对使用C很新,但基本上,我想执行以下行:

int a = system("python -m plotter");

将启动我开发的python模块。但是,我希望我的c程序的其余部分继续运行而不是等待命令完成执行(python应用程序处于无限循环,因此它不会自动关闭)。有没有办法用C / C ++做到这一点?

更新 解决方案是:

int a = system("start python -m plotter &");

5 个答案:

答案 0 :(得分:33)

system()只是将其参数传递给shell(在类Unix系统上,通常是/bin/sh)。

试试这个:

int a = system("python -m plotter &");

当然system()返回的值不是python脚本的退出状态,因为它还没有完成。

这可能仅适用于类Unix系统(可能包括MacOS);特别是,它可能不适用于MS Windows,除非你在Cygwin下运行。

在Windows上,system()可能会调用cmd.exe,它不接受在类Unix系统上使用相同语法的命令。但Windows start命令应该可以完成这项工作:

int a = system("start python -m plotter");

只要您编写特定于Windows的代码(start将无法在Unix上运行,除非您的start中恰好有$PATH命令),您可以考虑使用一些较低级别的Windows功能,可能是通过调用StartProcess。这更复杂,但它可能会让您更好地控制流程的执行方式。另一方面,如果system()符合您的要求,您也可以使用它。

答案 1 :(得分:4)

标准库中没有办法,但如果你的操作系统支持它,你可以派出或创建一个在后台运行它的独立线程。

答案 2 :(得分:4)

我相信如果你添加'&'在命令结束时它将起作用。 '&安培;'告诉命令在后台运行

int a = system("python -m plotter &");

答案 3 :(得分:2)

"系统" Linux上的命令只有在完成自身执行后才能执行其余的代码。

如果要同时处理,则应使用fork()。

答案 4 :(得分:1)

这个词是异步函数/方法调用。 C和C ++没有这样的功能,因此您必须在单独的线程中调用该函数,或者使用将在单独的进程中运行它的系统调用。尽管存在跨平台的线程库,但这两种方法都倾向于特定于平台。

我知道在unix中,在单独的流程中执行此操作,您将使用fork(2)创建新流程,并使用exec(3)在该流程中执行新程序。我不知道在Windows中需要什么系统调用,但应该是类似的。