本文涵蓋目錄創建刪除權限細節、POSIX 標準目錄讀取接口、進程工作目錄管理機制。
#include#include int mkdir(const char *pathname, mode_t mode); // 成功 0,失敗 -1
關鍵點:
. 和 .. 目錄項mode 會被進程 umask 修改0755),否則無法 cd 進入或訪問其中文件S_IRUSR | S_IWUSR(0600),缺少執行位#includeint rmdir(const char *pathname);
僅能刪除空目錄。若連接計數歸零且無進程打開,釋放空間;若有進程打開,延遲至最後關閉時釋放,但期間禁止在該目錄創建新文件。
早期系統目錄格式不一(如 V7 每項 16 字節),現代系統統一使用 <dirent.h> 接口:
#include#include DIR *opendir(const char *pathname); // 打開目錄流 struct dirent *readdir(DIR *dp); // 讀取下一項 void rewinddir(DIR *dp); // 重置讀取位置 int closedir(DIR *dp); // 關閉目錄流
struct dirent {
ino_t d_ino; // i-node 編號
char d_name[NAME_MAX + 1]; // 文件名(以 null 結尾)
};
注意:POSIX 僅規定 d_name,d_ino 為實現相關;NAME_MAX 值依文件系統而異(常見 255),可用 fpathconf 獲取。
void list_dir(const char *path) {
DIR *dp = opendir(path);
if (!dp) { perror("opendir"); return; }
struct dirent *entry;
while ((entry = readdir(dp)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dp);
}
順序與文件系統實現相關,通常非字母序。
#includeint chdir(const char *pathname); int fchdir(int fd); // 通過文件描述符切換
僅影響當前進程,不影響其他進程。內核僅記錄 i-node 號與設備號,不存完整路徑。
#includechar *getcwd(char *buf, size_t size); // 成功返回 buf,失敗 NULL
實現原理:從當前目錄向上遞歸查找 .. 中匹配當前 i-node 的項,層層向上至根目錄拼湊路徑。buf 需足夠大(含結束符),否則失敗。
mkdir(path, 0755)readdir 返回 NULL 區分結束與出錯(需配合 errno)getcwd 緩衝區:getcwd(NULL, 0) (GNU 擴展) 自動分配chdir 影響全局,謹慎使用