c++.系统调用move什么时候会失败

c++ . when can a system call to move fail?

本文关键字:失败 什么时候 move 系统调用 c++      更新时间:2023-10-16

读一些应该使用WEXITSTATUS检查系统调用返回状态的地方。然而,我不认为像system("mv /a/b/c /a/b/d")这样的呼叫如果失败就需要检查。

此呼叫可能失败的条件是什么?

一些可能性:

  1. /a/b/c不存在
  2. /a/b不存在
  3. 您对/a/b/c的访问权限不足
  4. 您对/a/b/d的访问权限不足
  5. /a/b/d已存在
  6. /a/b/c不可移动
  7. 没有外壳
  8. mv不存在
  9. 您没有足够的权限访问mv
  10. 您没有安装文件系统
  11. 您根本没有可用的存储空间

还有很多。。。

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

然后,使用rename(2)syscall(相关时由/bin/mv调用!)并直接编码:要简单得多

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

通过errno(3),即通过perror(3)获得解释重命名失败原因的错误代码。重命名(2)中的所有错误条件都是mv的相关故障情况,另请参见mv(1)!

阅读高级Linux编程。

如果(出于某种奇怪的原因,例如bind装载、符号链接…)/a/b/c/a/b/d不在同一个文件系统中,则会得到errno == EXDEV(在这种情况下,您可能会用源的副本和unlink来处理)。

通常,使用system("mv。。。应避免")。看看这个答案和这个解释为什么(还有这个和这个)。您的用户的PATH(或某些别名)中可能有不同的mv,因此mv至少应该是/bin/mv。。。如果.(甚至更糟的是/tmp!)在他的PATH早期并且具有符号链接mv/bin/rm你的用户不会高兴的!

顺便说一句,您通常不会使用以mv开头的编译时间常数字符串来调用system。这个字符串通常是内置的。如果你没有正确地引用一些事情(想象一下一个论点是; rm -rf $HOME),就会发生浩劫。此外,系统(3)可能会失败,例如因为fork(2)失败(用户进程太多,达到了setrlimit(2)的RLIMIT_NPROC限制…)。