2017-2018-1 20155310 《信息安全系统设计基础》 实现mypwd

2017-2018-1 20155310 《信息安全系统设计基础》 实现mypwd

作业要求:

1、学习pwd命令

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

3、实现mypwd

4、测试mypwd

学习pwd命令

命令简介:

该命令用来显示目前所在的工作目录。指令英文原义:print work directory

执行权限    :All User

指令所在路径:/usr/bin/pwd 或 /bin/pwd

命令语法:

pwd [OPTION]...

命令参数:

参数 长参数 描述
-L --logical(无效) 当目录为连接路径时,显示连接路径
-P --physical(无效) 显示实际物理路径,而非使用连接(link)路径
. --help 显示命令在线帮助(该参数无法使用)
. --version 显示命令版本信息(该参数无法使用)

使用示例:

1:查看pwd命令的帮助信息

 [email protected] init.d]# man pwd
    PWD(1)                           User Commands                          PWD(1)

    NAME
           pwd - print name of current/working directory

    SYNOPSIS
           pwd [OPTION]...

   DESCRIPTION
          Print the full filename of the current working directory.

          -L, --logical
                use PWD from environment, even if it contains symlinks

          -P, --physical
                 avoid all symlinks

          --help display this help and exit

          --version
                 output version information and exit

          NOTE:  your  shell  may  have  its  own version of pwd, which usually supersedes the version described here.  Please refer to your shell鈥檚 documentation for details about the
          options it supports.

   AUTHOR
          Written by Jim Meyering.

   REPORTING BUGS
          Report bugs to <[email protected]>.

   COPYRIGHT
          Copyright 漏 2006 Free Software Foundation, Inc.
          This is free software.  You may redistribute copies of it under the terms of the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.  There is NO WARRANTY,  to
          the extent permitted by law.

   SEE ALSO
          The full documentation for pwd is maintained as a Texinfo manual.  If the info and pwd programs are properly installed at your site, the command

                 info pwd

         should give you access to the complete manual.

   pwd 5.97                           May 2011                             PWD(1)
   (END)
  

2:显示当前目录所在路径 pwd

[[email protected] networking]# pwd
    /etc/sysconfig/networking

3:显示当前目录的物理路径 pwd –P

[[email protected] init.d]# cd /etc/init.d
    [[email protected] init.d]# pwd -P
    /etc/rc.d/init.d

4: 显示当前目录的连接路径:pwd -L

[[email protected] networking]# cd /etc/init.d
    [[email protected] init.d]# pwd -L
    /etc/init.d
    [[email protected] init.d]# pwd
    /etc/init.d

实现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;
}  

/*
dirent结构体:
struct dirent
{
    long d_ino; //inode number 索引节点号
    off_t d_off; //offset to this dirent 在目录文件中的偏移
    unsigned short d_reclen;// length of this d_name 文件名长
    unsigned char d_type; //the type of d_name 文件类型
    char d_name [NAME_MAX+1]; //file name (null-terminated) 文件名,最长255字符
};
DIR结构体:
struct __dirstream
{
    void *__fd; // `struct hurd_fd‘ pointer for descriptor.
    char *__data; // Directory block.
    int __entry_data; // Entry number `__data‘ corresponds to.
    char *__ptr; // Current pointer into the block.
    int __entry_ptr; // Entry number `__ptr‘ corresponds to.
    size_t __allocation;// Space allocated for the block.
    size_t __size; // Total valid data in the block.
    __libc_lock_define (, __lock) // Mutex lock for this structure.
};
typedef struct __dirstream DIR;
结构体stat:
struct stat {
    dev_t         st_dev;       //文件的设备编号
    ino_t         st_ino;       //节点
    mode_t        st_mode;      //文件的类型和存取的权限
    nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
    uid_t         st_uid;       //用户ID
    gid_t         st_gid;       //组ID
    dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
    off_t         st_size;      //文件字节数(文件大小)
    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
    unsigned long st_blocks;    //块数
    time_t        st_atime;     //最后一次访问时间
    time_t        st_mtime;     //最后一次修改时间
    time_t        st_ctime;     //最后一次改变时间(指属性)
};  */

运行截图:

时间: 2024-10-31 08:20:27

2017-2018-1 20155310 《信息安全系统设计基础》 实现mypwd的相关文章

20155229 《信息安全系统设计基础》 Mypwd实现

Mypwd 内容 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 学习pwd命令 通过man pwd查看 pwd命令来查看"当前工作目录"的完整路径. 每当在终端进行操作时,都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. 实例1:用 pwd 命令查看默认工作目录的完整路径 实例2:/bin/pwd -L 目录连接链接时,输出连接路径 -P 输出物理

2017-2018-1 20155310《信息安全系统设计基础》第十一周学习总结

2017-2018-1 20155310<信息安全系统设计基础>第十一周学习总结 教材学习内容总结 第九章 虚拟存储器 一.虚拟存储器提供了三个重要能力: 1.将主存看作是一个存储在磁盘上的地址空间的高速缓存,在主存中只保护活动的区域,并根据需要在磁盘和主存之间来回传送数据: 2.为每个进程提供了一致的地址空间,从而简化了存储器管理: 3.保护了每个进程的地址空间不被其它进程破坏. 二.理解虚拟存储器的原因: 1.虚拟存储器是中心的:它是硬件异常.硬件地址翻译.主存.磁盘文件和内核软件的交互中

2017-2018-1 20155310 20155337《信息安全系统设计基础》实验四外设驱动程序设计

2017-2018-1 20155310 20155337<信息安全系统设计基础>实验四外设驱动程序设计 外设驱动程序设计-1 学习资源中全课中的"hqyj.嵌入式Linux应用程序开 发标准教程.pdf"中的第十一章 提交康奈尔笔记的照片(可以多张) 外设驱动程序设计-2 在Ubuntu完成资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf"中的第十一章的test试验 提交编译,加载模块,卸载模块,测试运行的截图(要多张,全屏,体现

2017-2018-1 20155310 《信息安全系统设计基础》第十二周学习总结

2017-2018-1 20155310 <信息安全系统设计基础>第十二周学习总结 第一周 http://www.cnblogs.com/m20155310/p/7587317.html 第二周 http://www.cnblogs.com/m20155310/p/7618222.html 第三周 http://www.cnblogs.com/m20155310/p/7672424.html 第四周 http://www.cnblogs.com/m20155310/p/7672547.html

2017-2018-1 20155310 《信息安全系统设计基础》第十三周学习总结

2017-2018-1 20155310 <信息安全系统设计基础>第十三周学习总结 教材学习内容总结 8.2进程 进程是计算机科学中最深刻最成功的概念之一.系统中的每个程序都是运行在某个进程的上下文中的.(上下文是由程序正确运行所需的状态组成的) ?一个独立的逻辑控制流 ?一个逻辑流的执行在时间上与另一个流重叠,称为并发流. ?多个流并发地执行的一般现象称为冰法. ?多任务也叫作时间分片:一个进程和其他进程轮流运行的概念称为多任务. ?并行流是并发流的一个真子集. ?私有地址空间 ?上下文切换

2017-2018-1 20155310 《信息安全系统设计基础》课程总结

2017-2018-1 20155310 <信息安全系统设计基础>课程总结 ?每周作业链接汇总 ?第一周作业:学习教材第一章.第七章,二维码: ?第三周作业:第二章<信息的表示和处理>,二维码: ?第四周作业:课上未完成内容+完成head,tail的使用,相关API的分析,伪代码,产品代码,测试代码的编写,二维码: ?第五周作业:学习缓冲区溢出,二维码: ?第六周作业:第八章<异常控制流>,第十章<系统级I/O>,二维码: ?第七周作业:第四章<处理器

20145336张子扬 《信息安全系统设计基础》第7周学习总结

20145336张子扬 <信息安全系统设计基础>第1周学习总结 教材学习内容总结 学习目标: 了解常见的存储技术(RAM.ROM.磁盘.固态硬盘等) 理解局部性原理 理解缓存思想 理解局部性原理和缓存思想在存储层次结构中的应用 高速缓存的原理和应用 三种常见存储技术:RAM.ROM和磁盘 随机访问存储器RAM分为静态RAM(SRAM)和动态RAM(DRAM) SRAM 用来作为高速缓存储存器,SRAM将每个位存储在一个双稳态的存储器单元里,每个单元是用一个六晶体管电路来实现的.它可以无限制地保

20145317《信息安全系统设计基础》第六周学习总结(1)

20145317<信息安全系统设计基础>第六周学习总结(1) 第四章 处理器体系结构 指令体系结构:一个处理器支持的指令和指令的字节级编码 4.1Y86指令集体系结构 Y86:包括定义各种状态元素.指令集和它们的编码.一组编程规范和异常事件处理. Y86程序中的每条指令都会读取或修改处理器状态的某些部分.Y86具体包括:8个程序寄存器.3个条件码ZF\SF\OF.程序计数器(PC) Y86用虚拟地址引用存储器位置. 程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态. 注意:条件

20145239 《信息安全系统设计基础》第5周学习总结

20145239<信息安全系统设计基础>第5周学习总结 教材学习内容 x86寻址方式 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全 8086的分段模式 IA32的带保护模式的平坦模式 机器级编程的两种抽象 -ISA(Instruction set architecture).ISA简单来说就是指令集体系结构.定义了处理机状态,指令格式以及指令对状态的影响.-机器级使用的存储器地址是虚拟地址. 机器代码中的处理机状态 程序计数器(PC)表示将要执行的下一条指令在存储器中的地址. 整数