zoukankan      html  css  js  c++  java
  • 2017-2018-1 20155320加分项目——pwd的实现

    2017-2018-1 20155320加分项目——pwd的实现

    1 学习pwd命令

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

    3 实现mypwd

    4 测试mypwd

    实现过程

    • 首先通过man 命令了解了一下pwd的用法

    -课上楼老师提供的思路是

    1.先利用readdir 读取当前目录

    2.循环调用cd .. 找到上一级目录

    按照这个思路我的伪代码如下

    1. 首先通过读取当前目录的i-node节点,找到当前目录

    2. 判断是否为根目录,如果不是则通过chdir找到上一级目录,并打印出当前目录,更新当前目录

    3. 循环1,2步直到找到根目录为止

    实现

    • 之前没有用过readdir函数,通过man 命令了解了一下readdir函数的用法,发现他在很多情况下都要和opendir搭配使用

    • 关于cd ..的实现,我通过查找发现chdir这个函数可以达到这个效果

    • 获取当前目录的i-node,需要用到stat函数:
      头文件:
    #include <sys/stat.h>
    
    #include <unistd.h>
    
    

    定义函数: int stat(const char *file_name, struct stat *buf);

    函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中

    返回值: 执行成功则返回0,失败返回-1,错误代码存于errno

    代码如下:链接

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <dirent.h>
    #include <unistd.h>
    #include<string.h>
    ino_t get_inode(char* file);//取得文件名对应的i-node
    void get_inode_name(ino_t i_node,char *file_name,int length);//取得i-node对应的文件名
    void print_direct(ino_t i_node);//打印目录
    void main()
    {
        ino_t i_node;//i-node指针
    
        //char *file=".";
       
        print_direct(get_inode("."));
       printf("
    ");
    
    
    }
    
    void print_direct(ino_t i_node)//打印目录
    {
        ino_t n_inode;
        char *file_name[256];
     if(get_inode("..")!=get_inode(".")){//判断是否是根目录
          chdir("..");//进入上级目录
          get_inode_name(i_node,file_name,256);
         n_inode=get_inode(".");//更新当前目录的i-node
         print_direct(n_inode);
         printf("/%s",file_name);
    }
    }
    
    void get_inode_name(ino_t i_node,char *file_name,int length)
    //取得i-node 对应的文件名
    {
          DIR* dir_ptr;
        struct dirent* direntp;
            dir_ptr = opendir(".");
        while((direntp = readdir(dir_ptr)) != NULL)//当获取下一个目录流进入点失败时返回NULL
        {
              if(direntp->d_ino==i_node)//如果direntp索引节点号与待找的i—node相同时
            {
                strncpy(file_name,direntp->d_name,length);
                file_name[length-1]='';
                 closedir(dir_ptr);
        }
    //     else
      //          printf("failed to find the name of i-node");
           }
    
    }
    
    
    ino_t get_inode(char* file)//取得文件名对应的i-node
    {
    struct stat buf;
    if(stat(file,&buf)!=-1)//执行成功
    {
       return buf.st_ino;
    }
    else{
       printf("failed to get inode");
     }
    }
    
    
    • 运行结果为:

    实现中出现的问题

    • 问题1:编译出现如下问题:


    -解决:
    1.发现需要补充上头文件<string.h>

    2.bufsize 需要给定定义,我干脆将数组长度定为最大的256

    3.比较时需要用==

    • 问题2:解决完以上问题后,发现编译没有错误了,但是却运行不出来结果

    • 解决:起初感觉是代码的问题,改了很多都没能解决,后来在舍友的建议下用娄老师的虚拟机试了一下,居然运行出了结果!!只是出现了如下提示,这是我自己设置的错误提示并且打印出来了结果

    后来好好看了一下我的代码发现,不能将错误提示放在while里面
    ,将其删掉就好了,放到VB上也能运行正常,只是现在仍然不懂为什么之前在VB上运行不出来

  • 相关阅读:
    Altium Designer如何导出SMT贴片机用的坐标文件
    STM8S003设计注意事项
    Keil4打开KEIL5未响应卡死的问题
    STM32 adc 多通道采集相互串扰问题解决
    STM32 RS485 和串口 只能接收不能发送问题解决
    AD中元器件报警的处理——器件高度报警
    QT乱码解决办法《转》
    STM32下载失败,st-link v2 在线下载sw模式检测不到
    docker部署普罗米修斯监控
    进程管理常用命令
  • 原文地址:https://www.cnblogs.com/ljq1997/p/7856520.html
Copyright © 2011-2022 走看看