DIR函数在几天后返回false

时间:2016-06-27 12:28:14

标签: c++

我有一个守护进程(在Ubuntu Server 16.04上运行,使用bool DirectoryExists ( const char* path ) { if( path == NULL ) return false; DIR *d; d = opendir(path); if (d){ closedir(d); return true; } return false; } bool isEmpty(const char* path) { int n = 0; //Directory scan DIR *d; struct dirent *dir; d = opendir(path); if (d){ while ((dir = readdir(d)) != NULL){ if(dir->d_name[0] == '.')continue; if(++n > 0) break; } closedir(d); } else{ return false; } if (n == 0) //Directory Empty return true; else return false; } 编译)依赖于两个函数来知道目录是否存在以及它是否为空:

FALSE

问题是,在一天或两天守护程序工作之后,这些函数会在返回TRUE时开始不断返回DIR *(两者)。我怀疑DirectoryExists指针没有正确关闭,但我无法修复它。

我在这里做错了什么?

修改

在我的代码的某些部分,我使用errno来检查删除的目录是否真的消失了,或者它是否仍在那里。完成检查后,system("rm -rf " + fullpath); if(DirectoryExists(std::string(fullpath).c_str())){ syslog(LOG_ERR, "ERROR: Directory %s couldn't be removed", fullpath.c_str()); return false; } 设置为"没有这样的文件或目录",这是正确的,但我不知道这是否可能是我的问题的根源。

public void SendWhatsapp(View view) {

PackageManager pm=getPackageManager();
try {

    Intent waIntent = new Intent(Intent.ACTION_SEND);
    waIntent.setType("text/plain");
    String text = "YOUR TEXT HERE";

    PackageInfo info=pm.getPackageInfo("com.whatsapp", PackageManager.GET_META_DATA);
    //Check if package exists or not. If not then code 
    //in catch block will be called
    waIntent.setPackage("com.whatsapp");

    waIntent.putExtra(Intent.EXTRA_TEXT, text);
    startActivity(Intent.createChooser(waIntent, "Share with"));

   } catch (NameNotFoundException e) {
    Toast.makeText(this, "WhatsApp not Installed", Toast.LENGTH_SHORT)
            .show();
  }  

 }

编辑2:

正如我所怀疑的那样,当这些功能开始失败时,errno被设置为"太多的打开文件"

1 个答案:

答案 0 :(得分:1)

我的猜测是违规行是包含std::string(fullpath).c_str()的行:

if(DirectoryExists(std::string(fullpath).c_str())) {
   ...
}

你正在使用一个在函数进入之前被销毁的临时文件。幸运的是,c_str()所指向的内存似乎包含了你想要的字符串,但在某些情况下,这种情况不再如此(可能是因为内存碎片增加了内存分配器对重用内存的压力)。