c ++。什么时候系统调用移动失败?

时间:2014-01-02 04:37:44

标签: c++ system

阅读一些应该使用WEXITSTATUS的地方来检查系统调用的返回状态。 但是,我不认为像system("mv /a/b/c /a/b/d")这样的调用需要检查它是否失败。

此通话失败的条件是什么?

2 个答案:

答案 0 :(得分:3)

一些可能性:

  1. /a/b/c不存在
  2. /a/b不存在
  3. 您无权访问/a/b/c
  4. 您无权访问/a/b/d
  5. /a/b/d已存在
  6. /a/b/c不可移动
  7. 没有shell
  8. mv不存在
  9. 您无权访问mv
  10. 您没有安装文件系统
  11. 您根本没有可用的存储空间
  12. 还有很多......

答案 1 :(得分:2)

system("mv /a/b/c /a/b/d")/a/b/c/a/b/d很可能位于同一个file system上。我猜你有一个Posix系统,也许是Linux。

然后使用rename(2)系统调用(在相关时由/bin/mv调用!)并直接代码更简单:

if (rename("/a/b/c", "/a/b/d")) {
   perror("rename failed");
   exit(EXIT_FAILURE);
}

并且您将通过errno(3),即通过perror(3)错误代码解释重命名失败的原因。 rename(2)中的所有错误条件都是mv的相关失败案例,另请参阅mv(1)

阅读Advanced Linux Programming

如果(由于一些奇怪的原因,例如bind坐骑,符号链接,...)/a/b/c/a/b/d不在同一个文件系统中,你会得到{{1 (并且您可以通过副本后跟errno == EXDEV源来处理该情况。)

一般情况下,应避免使用 unlink ... system("mv 。请参阅this answerthis one解释原因(以及thisthis)。并且您的用户可能在其")(或某些别名)中使用了不同的mv,因此PATH至少应为mv ...如果/bin/mv(或者甚至更糟.!)在/tmp的早期,并且有一个符号链接PATHmv您的用户将不会满意!

顺便说一句,您通常不会使用以/bin/rm开头的编译时常量字符串调用system。该字符串通常是构建的。如果你没有正确引用事物(想象一个参数是mv),可能会发生破坏。 此外,system(3)可能会失败,例如因为fork(2)失败(用户流程太多,达到setrlimit(2); rm -rf $HOME限制...)。