0

我的 Mac OS 命令行应用程序正在进行 Unix 调用,例如:

system("rm -rf /Users/stu/Developer/file);

完美成功。

那么为什么以下不改变当前目录呢?

system("cd /Users/me/whatever");
system("pwd");    //cd has not changed
4

1 回答 1

4

因为

system()通过调用执行 command 中指定的命令,并在命令完成后返回。/bin/sh -c command

所以每个命令都是独立执行的,每个命令都在一个新的 shell 实例中。

因此,您的第一次调用会产生一个新的sh(使用您当前的工作目录),更改目录,然后退出。然后第二个调用产生一个新的sh(再次在你的 CWD 中)。

请参阅手册页system()


更好的解决方案是不使用system. 它有一些固有的缺陷,可能会让您面临安全漏洞。system()您应该使用等效的 POSIX C 函数, 而不是执行命令。 您可以从命令行执行的所有操作,都可以使用 C 函数执行(您认为这些实用程序如何工作?)

  • 而不是system("rm -rf ...")使用this
  • 而不是system("cd ...")使用chdir().
  • 而不是system("pwd ...")使用getcwd().

当然,存在一些差异,但这些是您尝试做的基本等价物。

于 2013-07-11T01:43:55.180 回答