20165223 《信息安全系统设计基础》 实现mypwd

一、学习pwd命令

1. pwd命令简介

  • 英文原名:Print Working Directory
  • 指令功能:打印出当前工作目录
  • 执行权限:All User
  • 指令所在路径:/usr/bin/pwd 或 /bin/pwd

2. pwd命令基本语法

  • pwd [OPTION]

3. pwd命令参数

选项描述
-L (即逻辑路径logical )使用环境中的路径,即使包含了符号链接
-P (即物理路径physical)避免所有的符号链接
–help显示帮助并退出
–version输出版本信息并退出

4. pwd命令退出状态

返回值状态
0成功
非零值失败

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

1. 实现pwd需要的系统调用

(1)先用man -k directory | gerp 2来查看一下是否有可用命令

1047360-20181125142538489-238763905.png

(2)发现命令getcwd符合找到当前目录的要求

1047360-20181125142739758-1146181828.png

  • 使用man getcwd查看系统调用

1047360-20181125142851496-1089964931.png

  • 找到需要的头文件和函数参数
#include <unistd.h>

char *getcwd(char *buf, size_t size);

(3) 同时还需要用到chdir,来改变当前目录

1047360-20181125143738488-2082296193.png

  • 使用man chdir查看系统调用

1047360-20181125143323977-953604771.png

  • 找到需要的头文件和函数参数
#include <unistd.h>

int chdir(const char *path);

(4)命令readdir也符合要求,用于打开并读取当前目录文件

1047360-20181125145124589-1667553393.png

  • 使用man readdir查看系统调用

1047360-20181125145319894-437947435.png

1047360-20181125145323051-1162307120.png

  • 找到需要的头文件和函数参数
#include <dirent.h>

struct dirent *readdir(DIR *dirp);

int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);

2. 伪代码

(1)用“.”获取当前目录的i-node(inode)
(2)用“..”获取父级目录的i-node(up_inode)
(3)判断当前目录的i-node和父级目录的i-node是否相同
(4)相同:到达根目录,输出完整路径,退出程序
(5)不同:还未到根目录,切换至父级目录,返回(1)再次执行相同操作直至两个i-node相同

三、实现mypwd

#include<stdio.h>  
#include<sys/stat.h>  
#include<dirent.h>  
#include<stdlib.h>  
#include<string.h>  
#include<sys/types.h> 
#include <unistd.h> 
void printpath();  
char *inode_to_name(int);  
int getinode(char *);  
//功能:打印当前目录路径
void printpath()  
{  
    int inode,up_inode;  
    char *str;
    inode = getinode(".");  
    up_inode = getinode("..");  
    chdir("..");  
    str = inode_to_name(inode);  
    //当当前目录的i-node与父级目录的i-node相同时,到达根目录
    if(inode == up_inode) {  
        return;  
    }  
    //打印路径
    printpath();  
    printf("/%s",str);  
}  
//功能:获取当前目录的i-node
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);  
}  
//主函数
int main()  
{  
    printpath();  
    putchar('\n');  
    return 0;  
}

四、测试mypwd

  • 测试截图,成功

1047360-20181125144401097-1602904230.png

1047360-20181125154331399-1201135000.png

  • 用pwd命令检测,一致

1047360-20181125144406734-1270683485.png

转载于:https://www.cnblogs.com/moddy13162201/p/10015460.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值