非阻塞版系统()

时间:2009-06-16 16:14:14

标签: c linux operating-system

我想从我的c程序中启动一个进程,但我不想等待该程序完成。我可以使用system()启动该进程,但始终等待。有没有人知道一个“非阻塞”版本会在流程启动后立即返回?

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

6 个答案:

答案 0 :(得分:19)

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

 system("ls -l &");
&&在命令行的末尾,参数会分叉您已启动的任务。

答案 1 :(得分:16)

为什么不使用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...

答案 2 :(得分:7)

正常的做法,实际上你不应该再使用system()了popen
这也允许您从生成的进程的stdin / out

读取或写入

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

最后,此代码似乎有效。上述答案的错误混淆:

pid = fork();

if (!pid)
{
    system("command here &");
}

exit(0);

不太确定为什么它可以正常工作,但它确实是我所追求的,感谢大家的帮助

答案 5 :(得分:0)

如果要在特定时间后退出命令,如何使用“超时”命令:

例如:system(“超时5您的命令在这里”); //如果未完成,则在5秒内终止命令