1. 程式人生 > >Mypwd實現

Mypwd實現

Mypwd實現

實現要求

  1. 學習pwd命令
  2. 研究pwd實現需要的系統呼叫(man -k; grep),寫出虛擬碼
  3. 實現mypwd
  4. 測試mypwd

學習pwd命令

image

可知pwd是用來顯示當前/活動目錄名稱

命令格式:pwd [選項]

pwd –P:顯示當前目錄的物理路徑

pwd -L:顯示當前目錄的連線路徑

一般情況下不帶任何引數

虛擬碼

獲取當前i-Node
從根目錄中找到和i-Node相同的值
用i-Node向前遞迴
輸出路徑

實現mypwd

#include<stdio.h>  
#include<sys/stat.h>  
#include<dirent.h>  
#include<stdlib.h>  
#include<string.h>  
#include<sys/types.h>  

void printpath();  
char *inode_to_name(int);  
int getinode(char *);  
int main()  
{  
printpath();  
putchar('\n');  
return ;  
}  
void printpath()  
{  
int inode,up_inode;  
char *str;  
inode = getinode(".");  
up_inode = getinode("..");  
chdir("..");  
str = inode_to_name(inode);  
if(inode == up_inode) {    
    return;  
}  
printpath();  
printf("/%s",str);  
}  
int getinode(char *str)  
{  
struct stat st;  
if(stat(str,&st) == -1){  
    perror(str);  
    exit(-1);  
}  
return st.st_ino;  
}  
char *inode_to_name(int inode)  
{  
char *str;  
DIR *dirp;  
struct dirent *dirt;  
if((dirp = opendir(".")) == NULL){  
    perror(".");  
    exit(-1);  
}  
while((dirt = readdir(dirp)) != NULL)  
{  
    if(dirt->d_ino == inode){  
        str = (char *)malloc(strlen(dirt->d_name)*sizeof(char));  
        strcpy(str,dirt->d_name);  
        return str;  
    }  
}  
perror(".");  
exit(-1);  
}

測試mypwd

image