C語言實現pwd—關於linux文件系統


#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <unistd.h>
/*
    DIR *opendir(const char *pathname),即打開文件目錄,返回的就是指向DIR結構體的指針
    struct __dirstream   
    {   
        void *__fd;    
        char *__data;    實施
        int __entry_data;    
        char *__ptr;    
        int __entry_ptr;    
        size_t __allocation;    
        size_t __size;    
        __libc_lock_define (, __lock)    
    };   
  
typedef struct __dirstream DIR;  
    int stat(const char *file_name, struct stat *buf);
    的作用就是獲取文件名為d_name的文件的詳細信息,存儲在stat結構體中。以下為stat結構體的定義:
    struct stat {   
        mode_t     st_mode;       //文件訪問權限   
        ino_t      st_ino;       //索引節點號   
        dev_t      st_dev;        //文件使用的設備號   
        dev_t      st_rdev;       //設備文件的設備號   
        nlink_t    st_nlink;      //文件的硬連接數   
        uid_t      st_uid;        //所有者用戶識別號   
        gid_t      st_gid;        //組識別號   
        off_t      st_size;       //以字節為單位的文件容量   
        time_t     st_atime;      //最后一次訪問該文件的時間   
        time_t     st_mtime;      //最后一次修改該文件的時間   
        time_t     st_ctime;      //最后一次改變該文件狀態的時間   
        blksize_t st_blksize;    //包含該文件的磁盤塊的大小   
        blkcnt_t   st_blocks;     //該文件所占的磁盤塊   
      };  
*/
/*根據文件名獲取文件inode-number*/
ino_t get_ino_byname(char *filename)
{
    struct stat file_stat;
    if (0 != stat(filename, &file_stat)) {
        perror("stat");
        exit(-1);
    }
    return file_stat.st_ino;
}

/*根據inode-number ,在當前目錄中查找對應的文件名*/
char* find_name_byino(ino_t ino)
{
    DIR *dp = NULL;
    struct dirent *dptr = NULL;
    char *filename = NULL;
    if (NULL == (dp = opendir("."))) {
        fprintf(stderr, "Can not open Current Directory\n");
        exit(-1);
    } else {
        while (NULL != (dptr = readdir(dp))) {
            if (dptr->d_ino == ino) {
                filename = strdup(dptr->d_name);
                break;
            }
        }
        closedir(dp);
    }
    return filename;
}

/*限制最大的目錄深度*/
#define MAX_DIR_DEPTH (256)

int main(int argc, char *argv[])
{
    /*記錄目錄名的棧*/
    char *dir_stack[MAX_DIR_DEPTH];
    unsigned current_depth = 0;

    for(;;) {
        /*1.通過特殊的文件名“.”獲取當前目錄的inode-number*/
        ino_t current_ino = get_ino_byname(".");
        /*2.通過特殊的文件名“..”獲取當前目錄的父級目錄的inode-number*/
        ino_t parent_ino = get_ino_byname("..");

        /*3.判斷當前目錄和上級目錄的inode-number是否一樣*/
        if (current_ino == parent_ino)
            break; /*4.如果兩個inode-number一樣說明到達根目錄*/

        /*5.如果兩個inode-number不一樣*/
        /*切換至父級目錄,根據步驟1獲取的inode-number,在父級目錄中搜索對應的文件名並記錄下來, 重新回到步驟1*/
        chdir("..");
        dir_stack[current_depth++] = find_name_byino(current_ino);
        if (current_depth>=MAX_DIR_DEPTH) { /*路徑名太深*/
             fprintf(stderr, "Directory tree is too deep.\n");
             exit(-1);
        }
    }

    /*輸出完整路徑名*/
    int i = current_depth-1;
    for (i = current_depth-1; i>=0; i--) {
       fprintf(stdout, "/%s", dir_stack[i]);
    }
    fprintf(stdout, "%s\n", current_depth==0?"/":"");

    return 0;
}

在linux 中的文件系統中,文件=N(N>=1)個inode +M(M>=1)個數據塊。

數據塊,存放文件的內容數據,數據塊的數目根據文件內容的大小而定。

inode稱為信息節點,其作用有二:1、存儲跟文件相關的屬性信息,如修改時間、所有者、文件類型和文件長度,注意這些信息里並沒有文件名;2、存儲指向文件內容數據塊的指針信息。

在一個文件系統中,一個inode代表一個文件,並使用一個整數值來標志該inode,稱為inode-number,該值對於一個文件系統而言是唯一的,即通過該值可以找到其對應的inode。一般情況下,一個文件只有一個inode信息用來描述它。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM