c++.系统调用move什么时候会失败
c++ . when can a system call to move fail?
读一些应该使用WEXITSTATUS
检查系统调用返回状态的地方。然而,我不认为像system("mv /a/b/c /a/b/d")
这样的呼叫如果失败就需要检查。
此呼叫可能失败的条件是什么?
一些可能性:
/a/b/c
不存在/a/b
不存在- 您对
/a/b/c
的访问权限不足 - 您对
/a/b/d
的访问权限不足 /a/b/d
已存在/a/b/c
不可移动- 没有外壳
mv
不存在- 您没有足够的权限访问
mv
- 您没有安装文件系统
- 您根本没有可用的存储空间
还有很多。。。
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
限制…)。
- 什么时候调用组成单元对象的析构函数
- 什么时候在C++中返回常量引用是个好主意
- 什么时候调用析构函数
- boost odeint什么时候真正调用观测者
- 编译器对数组声明大小的计算。什么时候发生?
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 您应该在什么时候创建自己的异常类型
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 什么时候可以使用常量装饰调用我的重载函数?
- unordered_map什么时候返回 -1?
- QCoreApplication什么时候有效?
- sizeof(size_t) 和 sizeof(ptrdiff_t) 什么时候会有所不同?
- 什么时候用指针调用C++类构造函数
- 我不明白在这个例子中什么时候调用构造函数
- dynamic_cast什么时候会因为隐藏符号而失败?
- 什么时候标准::线程::连接会因no_such_process而失败
- c++.系统调用move什么时候会失败
- 什么时候imwrite()失败?
- Ofstream,什么时候它会失败而不是创建一个新文件
- 弗洛伊德的寻周期算法什么时候会失败?