首页 > 其他分享 >mypwd学习笔记

mypwd学习笔记

时间:2022-10-23 10:11:05浏览次数:40  
标签:current stat 文件名 笔记 学习 pwd ino mypwd include

Mypwd

1. 学习pwd命令

man pwd查询:
image
pwd指令功能:Linux pwd(英文全拼:print work directory) 命令用于显示工作目录。执行 pwd 指令可立刻得知您目前所在的工作目录的绝对路径名称。

pwd指令语法如下:

pwd [OPTION]

pwd中有两个带参数的执行方式分别为pwd -l和pwd -p.

pwd -l 在环境中执行pwd命令,即使它包含符号链接.

pwd -p 避免所有符号链接,执行pwd命令。

image

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

image

伪代码:

点击查看代码
根据文件名获取文件的inode-number
stat()通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
根据inode-number, 在当前目录中查找对呀的文件名
opendir()打开一个目录,在失败的时候返回一个空的指针,成返回DIR结构体 
readdir()用来读取目录。返回是dirent结构体指针
strdup()将串拷贝到新建的位置处,返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值
主函数中获取路径并打印


3. 实现mypwd

代码如下:

点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <unistd.h>

#define MAX_DIR_DEPTH (256)  //限制最大的目录深度  
#define TRUE 1  
#define FALSE 0  
  
//根据文件名获取文件的inode-number  
ino_t get_ino_byname(char *filename)  
{  
    struct stat file_stat;  
    if(0 != stat(filename, &file_stat)) //stat()通过文件名filename获取文件信息,并保存在buf所指的结构体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("."))) //opendir()打开一个目录,在失败的时候返回一个空的指针,成返回DIR结构体  
    {  
        fprintf(stderr, "Can not open Current Directory\n");  
        exit(-1);  
    }  
    else  
    {  
        while(NULL != (dptr = readdir(dp))) //readdir()用来读取目录。返回是dirent结构体指针  
        {  
            if(dptr->d_ino == ino)  
            {  
                filename = strdup(dptr->d_name); //strdup()将串拷贝到新建的位置处,返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值.  
                break;  
            }  
        }  
  
        closedir(dp);  
    }  
  
    return filename;  
}  
  
int main(int argc, char *argv[])  
{  
    //记录目名的栈  
    char *dir_stack[MAX_DIR_DEPTH];  
    unsigned current_depth = 0;  
  
    while(TRUE)  
    {  
        ino_t current_ino = get_ino_byname("."); //通过特殊的文件名"."获取当期目录的inode-number  
  
        ino_t parent_ino = get_ino_byname(".."); //通过特殊的文件名".."获取当前目录的父目录的inode-number  
  
        if(current_ino == parent_ino)  
            break;               //达到根目录,推出循环  
  
        /*两个inode-number不一样*/  
        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;  
}  

image

标签:current,stat,文件名,笔记,学习,pwd,ino,mypwd,include
From: https://www.cnblogs.com/charliecza/p/16817997.html

相关文章

  • 2022-2023-1 20221309《计算机基础与程序设计》第八周学习总结
    2022-2023-120221309《计算机基础与程序设计》第八周学习总结作业信息这个作业属于哪个课程<班级的链接>这个作业要求在哪里<作业要求的链接>https://ww......
  • vue笔记 webpack配置vue环境
       import时需要写完整的路径,用webpack之后进行模块化开发,不需要引入完整的路径。 无需写完整的路径,直接去node_modules目录下面找     vue在npmrun......
  • ubantu学习 2 swap分区
    SWAP分区的作用:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序......
  • 数据结构栈与队列学习以及刷题总结
    1.栈与队列基本内容(1).栈:栈是一种线性结构,限定仅在表尾进行插入和删除操作的线性表。通过学习栈的性质,我们可以将其形象的想成叠盘子,每一个元素压入栈时都会成为栈顶元......
  • Python学习三天计划-3
    面向对象一、类的定义1.类定义class是关键字,表示要定义类了类的属性,即定义在类中的变量(成员变量)类的行为,即定义在类中的函数(成员方法)2.对象创建类对象的语法:cl......
  • 第八周第五章学习笔记
    第五章定时器及时钟服务一、硬件定时器定时器是由时钟源和可编程计数器组成的硬件设备。时钟源通常是一个晶体振荡器,会产生周期性电信号,以精确的频率驱动计数器。使用一......
  • TI的FMCW毫米波雷达培训笔记1:FMCW基本原理以及如何测量不同距离的物体的距离(雷达小白
    参考:培训地址:https://training.ti.com/mmwave-training-seriesIndish翻译Chinese:https://www.bilibili.com/video/BV1tE411j7vT一篇蛮不错的傅里叶变换通俗理解:https://......
  • 一起学习 Go 语言设计模式之设计模式概述
    我的语言之局限,即我的世界之局限。——LudwigWittgenstein(1889-1951)设计模式的概念模式是在特定环境下人们解决某种重复出现问题的一套成功有效的解决方案。设计模式(Desi......
  • GitHub Pages 和 Jekyll 笔记
    GitHubPages和Jekyll笔记快速创建(使用默认的Jekyll引擎)1.新建仓库新建一个空仓库,名称为username.github.io,其中username就是你的GitHub账号名称2.增加文......
  • 2022-2023-1 20221419 《计算机基础与程序设计》第8周学习总结
    2022-2023-120221419《计算机基础与程序设计》第8周学习总结作业信息班级:[2022-2023-1-计算机基础与程序设计]https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP......