【发布时间】:2010-11-03 09:40:24
【问题描述】:
我想从我的 c 程序中启动一个进程,但我不想等待该程序完成。我可以使用 system() 启动该过程,但总是等待。有谁知道一旦进程开始就会返回的“非阻塞”版本?
[编辑-附加要求]当原进程执行完毕后,子进程需要继续运行。
【问题讨论】:
-
我认为
system()是非阻塞的。
标签: c linux operating-system
我想从我的 c 程序中启动一个进程,但我不想等待该程序完成。我可以使用 system() 启动该过程,但总是等待。有谁知道一旦进程开始就会返回的“非阻塞”版本?
[编辑-附加要求]当原进程执行完毕后,子进程需要继续运行。
【问题讨论】:
system() 是非阻塞的。
标签: c linux operating-system
为什么不使用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...
【讨论】:
您的系统调用中有一个选项,请执行以下操作:
system("ls -l &");
命令行参数末尾的 & 派生了您已启动的任务。
【讨论】:
正常的方法是popen,实际上你不应该再使用system()了。
这也允许您从衍生进程的标准输入/输出读取或写入
edit:如果需要读写,请参阅 popen2() -thansk quinmars
【讨论】:
最后,这段代码似乎可以工作。上面的答案有点混搭:
pid = fork();
if (!pid)
{
system("command here &");
}
exit(0);
不太清楚为什么它会起作用,但它确实符合我的要求,感谢大家的帮助
【讨论】:
您可以使用posix_spawnp() 函数。它与 system() 非常相似,而不是 fork 和 exec* 组合,但不是阻塞的。
【讨论】:
如果您正在寻找在特定时间后退出的命令,如何使用“超时”命令:
Ex: system("timeout 5 your command here"); // 如果进程未完成,则在 5 秒内终止命令
【讨论】: