【发布时间】:2011-01-18 08:40:47
【问题描述】:
我需要在一个循环中执行一个带有不同参数的 unix 命令。现在我想知道我应该使用 execvp(),传入 cmd 和 args,还是使用 system,构建一个由 cmd + args 组成的字符串?
【问题讨论】:
我需要在一个循环中执行一个带有不同参数的 unix 命令。现在我想知道我应该使用 execvp(),传入 cmd 和 args,还是使用 system,构建一个由 cmd + args 组成的字符串?
【问题讨论】:
嗯,其他答案大部分都是正确的。
系统,虽然不仅是forks,然后是execs,它不会exec你的进程,它运行默认的shell,将你的程序作为参数传递。
所以,除非你真的想要一个 shell(用于参数解析等),否则执行以下操作会更高效:
int i = fork();
if ( i != 0 ) {
exec*(...); // whichever flavor fits the bill
} else {
wait(); // or something more sophisticated
}
【讨论】:
exec 系列函数将用新进程替换当前进程,而system 将分叉新进程,然后等待它完成。使用哪一个取决于你想要什么。
由于您是循环执行此操作,我猜您不想替换原始流程。因此,我建议您尝试使用system。
【讨论】:
system() 所做的。调用 system() 也会运行默认 shell 并将您的程序作为参数传递,这会产生更多开销。
只有当我无法通过系统实现我想要的功能时,我才会使用 execvp。请注意,要获得系统的等价物,您还需要 execvp、fork 和一些信号处理。
【讨论】: