我將繼續說,這是一個介紹Linux類的家庭作業。如果沒有我自己的廣泛嘗試,我不會發布它,並且由於本學期我是一名遠程學生,所以我無法到校園接受輔導。我需要一些幫助來找出問題所在。在C中使用POSIX中的目錄使用C
實際上,這個任務要求我們編寫一個程序,它的功能與POSIX中的pwd
命令具有相同的基本功能,以顯示當前目錄的絕對路徑。我們將與主要一起使用三個功能。我們也不要使用getcwd
命令。我將列出他們和他們的目的
inum_to_filename
:接受三個參數(inode編號來翻譯,在什麼地方的名字被寫入一個緩衝區,緩衝區的大小)。什麼都不返回它是:- 打開當前目錄,
- 閱讀的第一個目錄條目,
- 如果當前目錄的索引節點相匹配的傳入,名稱複製到緩衝區,並返回。
- 否則讀取下一個目錄條目並重覆上一步。
filename_to_inum
:接受一個參數(代表文件名的char *
)。它返回相應的inode號碼。它是:- 從文件inode中讀取信息到內存中的結構中。
- 如果有任何問題,請顯示相應的錯誤。
- 從結構中返回inode編號。
display_path
:接受一個參數(來自當前工作目錄的inode)。它什麼都不返回。它是:- 創建一個字符數組以用作目錄名稱的緩衝區。
- 使用
filename_to_inode
獲取父目錄的inode。 - 如果父節點inode等於當前的inode,我們已經到達root並且可以返回。
- 否則,切換到父目錄並使用
inum_to_filename
來查找傳入該函數的inode的名稱。使用步驟1中的緩衝區進行存儲。 - 遞歸調用
display_path
來顯示絕對路徑。
下面是代碼:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
void inum_to_filename (int inode_arg, char *pathBuffer, int size_arg) {
DIR *dir_ptr = opendir(".");
struct dirent *dirent_ptr = readdir(dir_ptr);
int counter = 0;
while (counter != 1) {
if (inode_arg == dirent_ptr->d_ino) {
strcat(pathBuffer, "/");
strcat(pathBuffer, dirent_ptr->d_name);
counter = counter + 1;
return;
} else {
dirent_ptr = readdir(dir_ptr);
}
}
closedir(dir_ptr);
}
int filename_to_inum (char *src) {
int res = 0;
struct stat info;
int result = stat(src, &info);
if (result != 0) {
fprintf(stderr, "Cannot stat ");
perror(src);
exit(EXIT_FAILURE);
} else {
res = info.st_ino;
}
return res;
}
void display_path (int ino_src) {
int bufSize = 4096;
char pathBuffer[bufSize];
int ino_prnt = filename_to_inum("..");
if (ino_src == ino_prnt) {
//print for test
inum_to_filename(ino_src, pathBuffer, bufSize);
printf("%s", pathBuffer);
return;
} else {
//print for test
chdir("..");
inum_to_filename(ino_src, pathBuffer, bufSize);
display_path(ino_prnt);
printf("%s", pathBuffer);
}
}
int main (int argc, char *argv[]) {
int c_ino = filename_to_inum(".");
display_path(c_ino);
printf("\n");
}
截至目前它顯示「/./MyName」與MYNAME在服務器上我個人命名的目錄。這是我從中運行該程序的目錄。當使用pwd時,我返回「/ home/MyName」。我不確定我的下一步獲得絕對路徑是正確的。
這是一個提示。你正在遞歸調用display_path。每個調用中的pathBuffer變量和每次調用返回後會發生什麼? –
Yuck。我不確定我是否理解在處理中如何使用這些效用函數。如果涉及多個文件系統,我也不相信只有inode數量就足夠了。 'inum_to_filename()'函數大綱並沒有考慮它在當前目錄中不會出現的inode號的可能性。基本技術通常是'查找當前目錄的索引節點號;打開父目錄,讀取條目並查找與當前目錄的inode匹配的inode條目。重複。 –
您需要確保在從inum_to_filename()返回之前關閉打開的目錄,否則會泄漏DIR描述符。 (順便說一下,根目錄的父節點的inode也是根目錄的inode,即'/ .'的inode與'/ ..'相同,通常是inode編號2)。 –