Странное поведение `stat ()`

Я хочу создать 2 каталога один внутри другого. Каталоги будут иметь случайно сгенерированные имена. Но я привел странное поведение stat() функция.

Каждый звонок stat() за dirname_ возвращается 0, Но внутри нет файлов workdir_, Все еще не могу выяснить, что не так в моем коде.

Составлено на Linux computer 3.8.0-26-generic #38-Ubuntu SMP Mon Jun 17 21:43:33 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

Вот источник:

#include <string>
#include <stdexcept>
#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>const std::string _randomStr(const int len) {
static const char alphanum[] =
"0123456789""ABCDEFGHIJKLMNOPQRSTUVWXYZ""abcdefghijklmnopqrstuvwxyz";
std::string s(len + 1, 0);
for (int i = 0; i < len; ++i) {
s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
}
return s;
}

int main(void)
{
std::string workdir_;
std::string dirname_;
struct stat sb;
int err = 0;

do {
workdir_ = "./" + _randomStr(10);
} while (0 == ::stat(workdir_.c_str(), &sb));
err = ::mkdir(workdir_.c_str(), 0755);
if (err)
throw std::runtime_error("failed to initialize directory");
std::cout << "workdir: " << workdir_ << std::endl;

do {
dirname_ = workdir_ + "/" + _randomStr(10);
} while (0 == ::stat(dirname_.c_str(), &sb));
err = ::mkdir(dirname_.c_str(), 0755);
if (err)
throw std::runtime_error("failed to initialize directory");
std::cout << "dirname : " << dirname_ << std::endl;
return 0;
}

1

Решение

У тебя есть фальшивка \0 в вашем dirname_, Когда вы печатаете имя каталога внутри цикла и запускаете через strace, вывод будет выглядеть так:

write(2, "dirname : ", 10)              = 10
write(2, "./zLOZ2nOXpP\0/7U20o0J90x\0", 25) = 25
write(2, "\n", 1)                       = 1
stat("./zLOZ2nOXpP", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0

Так, cerr или же cout правильно вывести строку (используя ее длину), но при преобразовании в C-строку с c_str() В результате получается только первое имя каталога, которое затем передается stat(),

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]