Env: Linux Ядро 5.3; FS: ext4
При запросе stat(const char *pathname, struct stat *statbuf)
как const char *pathname
проверяется на наличие?
Это необходимо, поскольку в случае отсутствия такого пути stat
возвращает -1 (ENOENT)
. Вот программа, которую я тестировал:
static const char *pathname = "/some/fancy/path/name";
int main(void){
struct stat statbuf;
unsigned long i = 0;
int fd = -1;
while(1){
if((++i) % 2){
fd = open(pathname, O_CREAT, 0644);
}
stat(pathname, &statbuf);
if(i % 2){
close(fd);
unlink(pathname);
}
}
}
Каждые 2 итерации файл удалялся и создавался заново на следующей. Для проверки стека вызовов ядра я использовал perf report
:
![enter image description here](https://i.stack.imgur.com/VU7rl.png)
Стек вызовов не оправдал моих ожиданий. Я ожидал ext4
вызовов под vfs_statx
для обхода ext4
внутренних структур данных, которые, вероятно, потребовали бы дискового ввода-вывода.
Если он был кэширован в inode или dentry cache, как грипп sh это, чтобы проверить, какие ext4
вызовы потребуют stat(const char *pathname, struct stat *statbuf);
?
UPD: При внимательном рассмотрении реализации я обнаружил, что она, похоже, взята из кеша dentry как указано в link_path_walk