阅读一些应该使用WEXITSTATUS
的地方来检查系统调用的返回状态。
但是,我不认为像system("mv /a/b/c /a/b/d")
这样的调用需要检查它是否失败。
此通话失败的条件是什么?
答案 0 :(得分:3)
一些可能性:
/a/b/c
不存在/a/b
不存在/a/b/c
/a/b/d
/a/b/d
已存在/a/b/c
不可移动mv
不存在mv
还有很多......
答案 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)!
如果(由于一些奇怪的原因,例如bind
坐骑,符号链接,...)/a/b/c
和/a/b/d
不在同一个文件系统中,你会得到{{1 (并且您可以通过副本后跟errno == EXDEV
源来处理该情况。)
一般情况下,应避免使用 unlink
... system("mv
。请参阅this answer和this one解释原因(以及this和this)。并且您的用户可能在其")
(或某些别名)中使用了不同的mv
,因此PATH
至少应为mv
...如果/bin/mv
(或者甚至更糟.
!)在/tmp
的早期,并且有一个符号链接PATH
➙mv
您的用户将不会满意!
顺便说一句,您通常不会使用以/bin/rm
开头的编译时常量字符串调用system
。该字符串通常是构建的。如果你没有正确引用事物(想象一个参数是mv
),可能会发生破坏。
此外,system(3)可能会失败,例如因为fork(2)失败(用户流程太多,达到setrlimit(2)的; rm -rf $HOME
限制...)。