1. 程式人生 > >2017-2018-1 20155315 《信息安全系統設計基礎》加分作業:實現mypwd

2017-2018-1 20155315 《信息安全系統設計基礎》加分作業:實現mypwd

解決 連接 i節點 兩種 系統調用 stat 一個 int 代碼

學習pwd命令

  • man pwd查看
    技術分享圖片
  • pwd命令用於顯示當前工作目錄,是Linux下最常用的命令之一。在不太確定當前位置時,就會使用pwd來判定當前目錄在文件系統內的確切位置。
  • 環境變量OLDPWD表示前一次的工作目錄,環境變量PWD表示當前的工作目錄。
  • 目錄連接鏈接時,pwd -P 顯示出實際路徑,而非使用連接(link)路徑;pwd顯示的是連接路徑
  • /bin/pwd
    • -L 目錄連接鏈接時,輸出連接路徑
    • -P 輸出物理路徑
  • 技術分享圖片

研究pwd實現需要的系統調用(man -k; grep),寫出偽代碼

實現pwd有兩種函數,一個是getcwd(),一個是多個函數嵌套。

  • getcwd()即得到當前工作目錄,調用這個函數,返回值就是當前目錄。
  • 使用系統調用函數,包括readdirchdir
    技術分享圖片

原始偽代碼

使用循環不斷進入上級目錄,讀取目錄名

do{
    readdir(".");
    chdir("..");
}while(i_node("..")!=i_node("."));

但是在編寫的過程中,發現先讀取的是子目錄,而要先顯示的是父目錄。一個解決辦法是將所有讀取到的目錄存到數組中,從最後一個元素開始顯示,但是覺得太麻煩了,改進了代碼。

改進偽代碼

pwd()
if(i_node("..")!=i_node("."))
{
    chdir("..");
    pwd("..");
    printf();
}

使用遞歸函數,就可以直接從父目錄開始顯示了。

實現mypwd

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <unistd.h>
ino_t get_inode(char*);
void pwd(ino_t);
void name(ino_t,char*,int);

int main()
{
    pwd(get_inode("."));  
    printf("\n");
    return 0;
}

void pwd(ino_t this_inode)
{
    ino_t my_inode;
    char its_name[BUFSIZ];
    if (get_inode("..")!=this_inode)                                 
    {
        chdir(".."); 
        name(this_inode,its_name,BUFSIZ);
        my_inode = get_inode(".");
        pwd(my_inode);
        printf("/%s",its_name);
    }
}

void name(ino_t inode,char* namebuf,int buflen)   //找到i-節點對應的文件名
{
    DIR* cdir;
    struct dirent* direntp;
    cdir = opendir(".");
    while((direntp = readdir(cdir)) != NULL)
    {
        if(direntp->d_ino == inode)
        {
            strncpy(namebuf,direntp->d_name,buflen);
            namebuf[buflen-1] = ‘\0‘;
            closedir(cdir);
            return;
        }
    }
    printf("error looking for inode\n");
}

ino_t get_inode(char* fname)            //根據文件名,返回-i節點
{
    struct stat info;
    stat( fname, &info);
    return info.st_ino;
}

測試mypwd

技術分享圖片

2017-2018-1 20155315 《信息安全系統設計基礎》加分作業:實現mypwd