MST

星途 面试题库

面试题:文件系统中创建目录的具体流程

请详细阐述在常见操作系统(如Linux或Windows)的文件系统中,创建一个新目录的具体操作流程,包括涉及到的系统调用、数据结构变化以及权限检查等方面。
35.1万 热度难度
操作系统文件系统

知识考点

AI 面试

面试题答案

一键面试

在Linux系统中创建新目录

  1. 系统调用:通常使用 mkdir 系统调用,在C语言中其原型为 int mkdir(const char *pathname, mode_t mode);pathname 是要创建目录的路径名,mode 用于指定新目录的权限。例如:
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    const char *dirname = "new_directory";
    mode_t mode = 0755;
    int ret = mkdir(dirname, mode);
    if (ret == -1) {
        perror("mkdir");
        exit(EXIT_FAILURE);
    }
    return 0;
}
  1. 数据结构变化
    • 目录项:文件系统会在父目录的目录项列表中添加一个新的目录项,该目录项记录了新目录的文件名以及其对应的inode号。
    • inode:文件系统为新目录分配一个新的inode,inode中记录了该目录的元数据信息,如文件类型(目录类型)、权限、所有者、大小(通常初始为0,随着子目录和文件的添加而改变)、时间戳等。
    • 块分配:文件系统会为新目录分配至少一个数据块,用于存储该目录下的目录项列表(即使当前为空目录)。
  2. 权限检查
    • 调用进程权限:调用 mkdir 的进程必须具有父目录的写权限,因为需要在父目录中添加新的目录项。如果进程没有父目录的写权限,mkdir 系统调用将失败并返回错误,例如 EACCES 错误。
    • umask影响:系统的umask值会影响新目录实际创建的权限。新目录的权限是 mode & ~umask。例如,如果 mode0755,umask是 0022,那么实际创建的目录权限是 0755 & ~0022 = 0733

在Windows系统中创建新目录

  1. 系统调用:在Windows API中,使用 CreateDirectory 函数来创建新目录。其原型为 BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);lpPathName 是要创建目录的路径,lpSecurityAttributes 用于指定新目录的安全属性,如果为 NULL,则使用默认的安全属性。例如:
#include <windows.h>
#include <stdio.h>

int main() {
    LPCTSTR dirname = TEXT("new_directory");
    BOOL ret = CreateDirectory(dirname, NULL);
    if (!ret) {
        DWORD error = GetLastError();
        printf("CreateDirectory failed with error %d\n", error);
        return 1;
    }
    return 0;
}
  1. 数据结构变化
    • MFT(主文件表):NTFS文件系统(Windows常用文件系统)使用MFT来记录文件和目录的信息。创建新目录时,会在MFT中分配一个新的记录项,记录新目录的文件名、属性(如文件类型为目录)、安全描述符等信息。
    • 索引分配:NTFS会为目录分配索引结构(类似B+树),用于存储目录下的文件和子目录的信息。即使是一个空目录,也会有相应的索引结构。
  2. 权限检查
    • 调用进程权限:调用 CreateDirectory 的进程必须具有父目录的 FILE_ADD_SUBDIRECTORY 访问权限。如果进程没有该权限,函数将失败并通过 GetLastError 返回错误码,如 ERROR_ACCESS_DENIED
    • 安全描述符:新目录的安全描述符决定了后续对该目录的访问权限。如果 lpSecurityAttributesNULL,新目录将继承父目录的安全描述符,这意味着从父目录继承权限设置。