课下实践——实现Mypwd

实现Mypwd

学习pwd命令

  • 想要知道当前所处的目录,可以用pwd命令,该命令显示整个路径名。
  • L 目录连接链接时,输出连接路径
  • P 输出物理路径

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

  • 内核为每个目录都设置了一个指向自己的i节点入口,即".",还有一个指向其父目录i节点的入口,即”..",我们首先获取当前目录的i节点编号,但是并不能知道当前目录的名称,我们切换到其的父目录,在里面寻找当前i节点编号对应的文件名即可。这样我们就很容易联想到使用递归来实现,但是终止条件是什么呢?在Unix文件系统的根目录中,“."和“..”指向同一个i节点,我们可以以此判断是否发到达了根目录,
  • 伪代码:
    int main(){
    if("."".."不指向同一个节点。){
    递归调用(切换到父目录
    寻找当前节点对应文件名)
    }
    }

实现

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

#define SIZE 128

ino_t get_inode(char *dirname);
void get_work_dir(ino_t inode_num);
void inode_to_dirname(ino_t inode_num, char *buf, int buflen);

int main(void)
{
    get_work_dir(get_inode("."));
    printf("\n");
    return 0;

}

ino_t get_inode(char *dirname)
{
    struct stat info;
    if (stat(dirname, &info) == -1)
    {
        perror("dirname");
        exit(1);
    }

    return info.st_ino;
}

void get_work_dir(ino_t inode_num)
{
    ino_t parent_inode;
    char buf[SIZE];
    if (get_inode("..") != inode_num)
    {
        chdir("..");
        inode_to_dirname(inode_num, buf, SIZE);
        parent_inode = get_inode(".");
        get_work_dir(parent_inode);
        printf("/%s", buf);
    }
}

void inode_to_dirname(ino_t inode_num, char *buf,int buflen)
{
    DIR *dir_ptr;
    struct dirent *dire;
    if ((dir_ptr = opendir(".")) == NULL)
    {
        perror(".");
        exit(1);
    }

    while ((dire = readdir(dir_ptr)) != NULL)
    {
        if (dire->d_ino == inode_num)
        {
            strncpy(buf, dire->d_name, buflen);
            buf[strlen(buf)] = ‘\0‘;
            closedir(dir_ptr);
            return ;
        }
    }
    fprintf(stderr, "error looking for inode number %d\n", (int)inode_num);
    exit(1);

}

测试代码

时间: 2024-11-02 12:10:31

课下实践——实现Mypwd的相关文章

2017-2018-1 20155226 《信息安全系统设计基础》课下实践——实现mypwd

2017-2018-1 20155226 <信息安全系统设计基础>课下实践--实现mypwd 1 学习pwd命令 输入pwd命令 发现他是给出当前文件夹的绝对路径. 于是 man 1 pwd查看pwd详细 然后查看pwd实现需要的系统调用man -k; grep 在这发现了一个功能相同的内核函数getcwd 到这步就很简单了,先查看这个函数man getcwd 2 写出伪代码 char一个数组: 调用内核函数[getcwd()]获取当前目录的绝对路径并保存至数组中: if(返回的指针==NUL

# 2017-2018-1 20155302 课下实践IPC

2017-2018-1 20155302 课下实践IPC 共享内存 共享内存允许两个或多个进程共享一定的存储区,因为不需要拷贝数据,所以这是最快的一种IPC. 共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在该进程的地址空间(这里的地址空间具体是哪个地方?)中.其他进程可以将同一段共享内存连接到自己的地址空间中.所有进程都可以访问共享内存中的地址,就好像它们是malloc分配的一样.如果一个进程向共享内存中写入了数据,所做的改动将立刻被

2017-2018-1 20155214 《信息安全系统设计基础》 第9周课下测试-mypwd

2017-2018-1 20155214 <信息安全系统设计基础> 第9周课下测试-mypwd(深入版) 题目要求: 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 在第9周学习总结中,我直接调用了系统调用getcwd()输出当前绝对路径.这次我尝试用c语言实现它的功能. 函数原型 #include <unistd.h> char *getcwd(char *buf, size_t size);

android从放弃到坚持放弃第二课(下)

续第二课( 下) 续第二课 下 活动的生命周期 返回栈 活动状态 活动的生存期 体验活动的生命周期 活动被回收怎么办 活动的启动模式 standard singleTop singleTask singleInstance 实践出真知 知晓当前是哪一个活动 随时随地退出程序 启动活动的最佳写法 问题 写app必须掌握活动的生命周期. [活动的生命周期] [返回栈] android每次启动的活动会覆盖在原活动之上,然后点击Back键会销毁最上层的活动.是使用Task来管理活动,一个任务就是一组存放

# 20155337 2017-2018 1 课上测试、课下作业、实验

20155337 2017-2018 1 课上测试.课下作业.实验 第一周 学习总结 第二周 课堂实践 第三周 学习总结 第四周 学习总结+myod 第五周 学习总结 课堂实践 第六周 学习总结 实验一 第七周 学习总结 实验二 第八周 加分项目pwd 第九周 学习总结 第十周 实验三 第十一周 学习总结

20165315 第二次考试课下补做

20165315 第二次考试课下补做 课上内容的补做,结果截图 参考http://www.cnblogs.com/rocedu/p/6766748.html 编程实现1!+2!+3!+... + N!的功能,N由命令行传入,比如类名为SumofRecur, java SumofRecur 8 给出1!+2!+3!+... + 8!的值, 提交运行结果的截图(至少五张),注意测试正常,异常,边界情况, 比如java SumofRecur -8,java SumofRecur 0,java Sumo

20165306 第四周课下作业

第四周课下作业 一.相关知识点总结 Ctrl+Shift+T 打开三个标签页,Alt+1进入第一个标签页 vim HelloJDB.java编辑调试示例代码 javac -g -d bin src/HelloJDB.java编译,-g 参数为了产生各种调试信息,一定要加上 jdb -classpath .:./bin HelloJDB 调试 stop in方法断点,stop at行断点 run运行,locals查看变量 print i或eval i查看变量i的值 list查看运行到了源代码的什么

20155327第十周课下作业

实践一 教材p448 Example15_4 list中增加自己学号后三名同学,学号是最后三名的从1号开始加入 提交运行结果截图 刻下推送代码到码云 实践二 数据结构和算法中,排序是很重要的操作,要让一个类可以进行排序,有两种方法: 有类的源代码,针对某一成员变量排序,让类实现Comparable接口,调用Collection.sort(List) 没有类的源代码,或者多种排序,新建一个类,实现Comparator接口 调用Collection.sort(List, Compatator) 针对

智慧解析第03课下:春秋故事 出逃

智慧解析第03课下:春秋故事 出逃,布布扣,bubuko.com