分叉子进程所花费的时间

use*_*260 6 c++ fork system

这是我之前的问题的续集.我正在使用fork来创建子进程.在孩子里面,我命令运行一个过程如下:

if((childpid=fork())==0)
{
system("./runBinary ");
exit(1)
}
Run Code Online (Sandbox Code Playgroud)

我的runBinary具有测量从开始到结束所需时间的功能.

令我惊讶的是,当我在命令行上直接运行runBinary时,需要大约60秒.但是,当我将它作为子进程运行时,它需要更多,例如~75或更多.有什么我可以做或目前做错了,这导致了这个?

我在这里先向您的帮助表示感谢.更多细节:我在Linux RHEL服务器上运行,有24个核心.我在测量CPU时间.一次,我只使用taskset(代码中未显示)将8个子节点(顺序)分叉,每个子节点绑定到不同的核心.除我自己的程序外,系统未加载.

Fab*_*llo 2

system() 函数用于调用 shell。您可以在其中执行任何操作,包括运行脚本。这为您提供了很大的灵活性,但它是有代价的:您正在加载一个外壳,然后在其中运行Binary。虽然我不认为加载 shell 会造成这么大的时间差异(毕竟 15 秒很多),因为你似乎不需要它 - 只是为了运行应用程序 - 尝试使用 exec 中的东西()家庭代替。

  • 好吧,只需加载 shell 并解释给定的命令行就可以提高速度。关于命令行,我不明白,你到底说你不能做什么?您可以将参数传递给它,唯一的额外工作是您必须将参数放入数组中 - 如果使用 execv 变体 - 或者至少将二进制名称放在单独的字符串中 - 如果使用 execl 变体。例如,可以使用 strtok 来完成这些事情。 (2认同)