system()的非阻塞版本

问题描述 投票:20回答:6

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

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

c linux operating-system
6个回答
19
投票

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

 system("ls -l &");

命令行参数末尾的&会分叉您启动的任务。


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...

7
投票

通常的做法,事实上,您实际上不应该再使用system()了,是popen。这也使您可以从生成的进程的stdin / out中读取或写入

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


1
投票

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


0
投票

最后,此代码似乎有效。上面的答案有些混乱:

pid = fork();

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

exit(0);

不太清楚为什么可以用,但是它可以满足我的要求,感谢大家的帮助


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.