Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ unlink()失败,返回“0”;没有这样的文件或目录;就在存在被证实之后_C++_Linux_File_Filesystems - Fatal编程技术网

C++ unlink()失败,返回“0”;没有这样的文件或目录;就在存在被证实之后

C++ unlink()失败,返回“0”;没有这样的文件或目录;就在存在被证实之后,c++,linux,file,filesystems,C++,Linux,File,Filesystems,我在应用程序中观察到非常奇怪的行为 我有以下职能: bool File::Exists(const std::string & Path) { struct stat S; if(stat(Path.c_str(), &S) != 0) return false; if(!S_ISREG(S.st_mode)) return false; return true; } void File::Remove(con

我在应用程序中观察到非常奇怪的行为

我有以下职能:

bool File::Exists(const std::string & Path)
{
    struct stat S;
    if(stat(Path.c_str(), &S) != 0)
        return false;

    if(!S_ISREG(S.st_mode))
        return false;

    return true;
}

void File::Remove(const std::string & Path)
{
    if(unlink(Path.c_str()) != 0)
        throw Exceptions::Exception(EXCEPTION_PARAMS, errno);
}
我使用的代码是:

...
const std::string Path = ...;
if(File::Exists(Path))
    File::Remove(Path);
...
此时抛出异常:

No such file or directory (2)
关键事实:

  • 每1k-10k通话一次
  • 所有被删除的文件都是二进制文件,大约20MB
  • 这在应用程序线程中被调用,但是这是访问这些文件的唯一线程(没有其他线程/进程访问它们)。甚至它们所在的其他进程/用户访问分区也没有
  • 要删除的文件位于已装入的CIFS(SMB)(网络)装入点上

为什么stat()报告文件存在,但unlink()有时会失败?

这些调用的强度有多大?您是否试图一次删除数千个文件?还是一秒/分钟一两次?通过网络,你可以得到各种各样的超时,这些超时可以解释为“没有这样的文件或目录”,但实际上是另一个问题

如果你要删除它们,为什么还要检查它们的存在呢?只需删除它们,然后检查异常以确定它是否不存在,或者是否存在其他错误,或者甚至不这样做。要么它们消失了,要么你无论如何都不能删除它们…

为什么stat()报告文件存在,但unlink()有时会失败

因为这些电话不会同时发生

此错误非常常见,它有自己的错误:

在软件开发中,从检查时间到使用时间(TOCTTOU或 TOCTOU,发音为“TOCK too”)是由 在检查某个条件(例如 安全凭据)以及该检查结果的使用。这是 一个竞赛条件的例子


每分钟调用一次cleanup()循环将删除10个文件。计算机和存储器在1Gbps局域网上。此程序是存储设备的唯一用户。如果我得到“没有这样的文件…”-文件是否真的被删除了?“文件是否真的被删除了?”通常是的。但是,如果文件对您隐藏,就您而言,它并不存在——即使它可能仍然存在。这完全取决于你的权限。事实并非如此。没有竞争条件,因为只有一个实体可以访问存储。@peku33只有一个实体可以访问存储显然没有。这个bug有一个名字和一个维基百科页面。在删除之前检查文件是否存在是一种竞争条件,它不仅没有用处,而且是不完整的。那么,如果只是存在呢。它是只读文件系统吗?该进程是否具有删除权限?除非重新创建所有已完成的检查,因为您在内核内部没有访问权限,所以没有数据可执行,否则这是没有用的。