Mypwd 的解读与实现 20155208

linux下pwd命令的编写

实验要求:

1 、学习pwd命令

2 、 研究pwd实现需要的系统调用(man -k; grep),写出伪代码

3 、实现mypwd

4 、测试mypwd

对pwd的了解

  • 以绝对路径的方式显示用户当前工作目录,命令将当前目录的全路径名称(从根目录)写入标准输出, 全部目录使用/分隔,第一个/表示根目录, 最后一个/ 表示当前目录。 执行pwd 命令可以立刻知道目前所在的工作目录的绝对路径名称。
  • pwd--输出当前或者工作目录

SYNOPSIS

pwd [OPTION]

DESCRIPRION

输出当前工作目录的全文件名

-help : 显示帮助信息

-version : 输出帮助信息

  • 参数:

-P: 查看当前目录的真实物理目录

-L:查看当前目录的逻辑目录

pwd的实现:

1、由于在Linux/Unix文件系统中,每个文件对应的inode值都是唯一的。

2、注意一点,chdir()这个系统调用,是改变当前程序的工作目录,不是改变bash的工作目录,这是不一样的。

  • 源代码:
#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) {  
    //  printf("/%s",str);  
        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);  
}

运行成功截图:

实验感想:

这次的实验让我对pwd命令进行了更深层次的了解,懂得了他的使用原理,并且用C语言进行了实现,收获很多。