【问题标题】:When to use system() and when to use execv*()?何时使用 system() 以及何时使用 execv*()?
【发布时间】:2011-01-18 08:40:47
【问题描述】:

我需要在一个循环中执行一个带有不同参数的 unix 命令。现在我想知道我应该使用 execvp(),传入 cmd 和 args,还是使用 system,构建一个由 cmd + args 组成的字符串?

【问题讨论】:

    标签: c exec unix


    【解决方案1】:

    嗯,其他答案大部分都是正确的。

    系统,虽然不仅是forks,然后是execs,它不会exec你的进程,它运行默认的shell,将你的程序作为参数传递。

    所以,除非你真的想要一个 shell(用于参数解析等),否则执行以下操作会更高效:

    int i = fork();
    if ( i != 0 ) {
        exec*(...); // whichever flavor fits the bill
    } else {
        wait(); // or something more sophisticated
    }
    

    【讨论】:

      【解决方案2】:

      exec 系列函数将用新进程替换当前进程,而system 将分叉新进程,然后等待它完成。使用哪一个取决于你想要什么。

      由于您是循环执行此操作,我猜您不想替换原始流程。因此,我建议您尝试使用system

      【讨论】:

      • 系统还会对该行进行命令行解析,这可能会为注入攻击打开漏洞。
      • 我在网上寻找了一些关于这方面的教程,大多数示例 fork() 生成了一个新进程,然后用 execvp() 替换了 fork。之后,父进程等待子进程完成。这基本上是 system() 的作用吗?
      • 是的,这基本上就是system() 所做的。调用 system() 也会运行默认 shell 并将您的程序作为参数传递,这会产生更多开销。
      【解决方案3】:

      只有当我无法通过系统实现我想要的功能时,我才会使用 execvp。请注意,要获得系统的等价物,您还需要 execvp、fork 和一些信号处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-13
        • 2015-01-07
        • 2016-09-23
        • 2021-02-09
        • 2019-08-12
        • 1970-01-01
        • 2020-01-11
        相关资源
        最近更新 更多