20155222 c语言实现linux的pwd命令

  • 1.学习pwd命令在Linux层次结构中,用户可以在被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录。然而,没有提示符来告知用户目前处于哪一个目录中。想要知道当前所处的目录,可以用pwd命令,该命令显示整个路径名。

  • 2.研究实现pwd所需的系统调用

opendir(打开目录)

相关函数 open,readdir,closedir,rewinddir,seekdir,telldir,scandir

表头文件

#include<sys/types.h>
#include<dirent.h>

定义函数

DIR * opendir(const char * name);

函数说明 opendir()用来打开参数name指定的目录,并返回DIR形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值。

返回值 成功则返回DIR
型态的目录流,打开失败则返回NULL。

错误代码 EACCESS 权限不足

EMFILE 已达到进程可同时打开的文件数上限。

ENFILE 已达到系统可同时打开的文件数上限。

ENOTDIR 参数name非真正的目录

ENOENT 参数name 指定的目录不存在,或是参数name 为一空字符

串。

ENOMEM 核心内存不足。

readdir(读取目录)

相关函数 open,opendir,closedir,rewinddir,seekdir,telldir,scandir

表头文件

#include <sys/types.h>
#include <dirent.h>

定义函数 struct dirent * readdir(DIR * dir);

函数说明 readdir()返回参数dir目录流的下个目录进入点。

结构dirent定义如下

struct dirent
{
ino_t d_ino;
ff_t d_off;
signed short int d_reclen;
unsigned char d_type;
har d_name[256;
};

d_ino 此目录进入点的inode

d_off 目录文件开头至此目录进入点的位移

d_reclen _name的长度,不包含NULL字符

d_type d_name 所指的文件类型

d_name 文件名

返回值 成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL。

附加说明 EBADF参数dir为无效的目录流。

 

范例:

#include<sys/types.h>
#include<dirent.h>
#include<unistd.h>
main()
{
DIR * dir;
struct dirent * ptr;
int i;
dir =opendir(“/etc/rc.d”);
while((ptr = readdir(dir))!=NULL)
{
printf(“d_name: %s\n”,ptr->d_name);
}
closedir(dir);
}
执行
d_name:.
d_name:..
d_name:init.d
d_name:rc0.d
d_name:rc1.d
d_name:rc2.d
d_name:rc3.d
d_name:rc4.d
d_name:rc5.d
d_name:rc6.d
d_name:rc
d_name:rc.local
d_name:rc.sysinit

closedir(关闭目录)

相关函数 opendir

表头文件

#include<sys/types.h>
#include<dirent.h>

定义函数 int closedir(DIR *dir);

函数说明 closedir()关闭参数dir所指的目录流。

返回值 关闭成功则返回0,失败返回-1,错误原因存于errno 中。

错误代码 EBADF 参数dir为无效的目录流

  • 3.实现步骤:

    步骤一:查看当前目录"."文件的inode-number

    步骤二:查看当前目录“..”文件的inode-number

    步骤三:比较两个inode-number,若相等,已到根目录,进入步骤四,否则进入“..”,根据步骤一中获取的inode-number,在目录中查找相应的文件名并将其入栈,回到步骤一。

    步骤四:依次出栈输出路径名

  • 4.实现代码


#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<dirent.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
int main()
{ char this_name[20]=".",father_name[20]="..";
char name[16][32];
struct dirent *this_dir=NULL,*father_dir=NULL,*temp=NULL;
DIR *dir=NULL;
int i=0;
unsigned long int this_ino;
while(1)
{
dir = opendir(this_name);
if(dir == NULL)
printf("error open");
while(1)
{
this_dir = readdir(dir);
if(strcmp(this_dir->d_name,".")==0)
break;
}
this_ino=this_dir->d_ino;
closedir(dir);
dir = opendir(father_name); while(1)
{
father_dir = readdir(dir);
if(father_dir->d_name[0]=='.'&&father_dir->d_name[1]=='.')
break;
}
if(this_dir->d_ino==father_dir->d_ino)
break;
closedir(dir);
dir=opendir(father_name);
while((temp=readdir(dir))!=NULL)
{
if(temp->d_ino==this_ino)
{
bzero(name[i],32);
strcat(name[i++],temp->d_name);
break;
}
}
closedir(dir);
strcat(this_name,"/..");
strcat(father_name,"/..");
}
for(i--;i>=0;i--)
printf("/%s",name[i]);
printf("\n");
}
  • 5.测试代码

20155222 c语言实现pwd命令的更多相关文章

  1. 20155212 C语言实现linux下pwd命令的两种方法

    20155212 C语言实现linux下pwd命令的两种方法 学习pwd命令 通过man pwd命令查看 pwd [OPTION],一般不加参数 -P显示当前目录的物理路径 -L显示当前目录的连接路径 ...

  2. 加分项——C语言实现Linux的pwd命令

    加分项--C语言实现Linux的pwd命令 实现要求 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd pwd pw ...

  3. 20155308 加分项——C语言实现Linux的pwd命令

    20155308 加分项--C语言实现Linux的pwd命令 实现要求 学习pwd命令 什么是pwd pwd' 代表的是'Print Working Directory'(打印当前目录).如它的名字那 ...

  4. 2017-2018-1 20155201 《信息安全系统设计基础》 pwd命令的实现

    2017-2018-1 20155201 <信息安全系统设计基础> pwd命令的实现 一.对pwd命令的学习 在终端中输入man pwd查看手册中对pwd这一命令的解释: 以绝对路径的方式 ...

  5. pwd命令的实现

    pwd 命令描述 Linux中用 pwd 命令来查看"当前工作目录"的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd ...

  6. 20155322 2017-2018-1《信息安全系统设计》第九周 Linux命令:pwd命令学习与简单实现

    pwd命令学习 功能 Linux中用 pwd 命令来查看"当前工作目录"的完整路径. 格式 pwd [选项] 实例 用 pwd 命令查看默认工作目录的完整路径: 用 pwd 命令查 ...

  7. linux常用命令(2)pwd命令

    pwd 命令1 命令格式:pwd [选项]2 命令功能查看当前工作目录的完整路径3 常用参数一般不带任何参数如果目录是链接时:pwd -P 显示实际路径,而非使用链接路径4 常用实例:4.1 用pwd ...

  8. pwd命令

    [pwd]      打印当前的工作目录             pwd==print work director 命令格式: pwd [OPTION]... 命令功能: 打印当前工作目录的全路径 命 ...

  9. Linux命令学习总结:pwd命令

    命令简介: 该命令用来显示目前所在的工作目录.指令英文原义:print work directory 执行权限    :All User 指令所在路径:/usr/bin/pwd 或 /bin/pwd ...

随机推荐

  1. Vue2学习笔记:组件(Component)

    组件 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能.在有些情况 ...

  2. 从一个简单的 JPA 示例开始

    本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示例:接着重构该示例,并引入 Sp ...

  3. 获取WebService的请求信息

    一个已经写好的项目中有多个WebService,由于之前没有记录请求信息的,有时候需要查错等需要找到当次的请求信息,所以需要加入记录请求信息的功能. 首先想到的是在每一个带有WebMethod特性的方 ...

  4. ASP.NET MVC使用AuthenticationAttribute验证登录

    首先,添加一个类AuthenticationAttribute,该类继承AuthorizeAttribute,如下: using System.Web; using System.Web.Mvc; n ...

  5. Ubuntu做Tomcat服务:insserv: warning: script 'tomcat' missing LSB tags and overrides

    https://blog.csdn.net/hanchao5272/article/details/79819460 转载自:https://blog.bbzhh.com/index.php/arch ...

  6. HTML、jsp页面中radio,checkbox,select数据回显功能,默认被选中问题

    最近常常遇到各种复选框.单选框.下拉框的默认被选中的问题,开始也是绞尽脑汁的想办法,今天写一篇学习总结的博文来写一下学习总结. 单选框(radio)默认被选中: 一.jstl技术进行回显 <in ...

  7. css3实现 依次出现三个点(一般用于提示加载中。。。 提交中。。。)

    <a href="javascript:" class="login">登录中<span class="dotting"& ...

  8. (转)em重建全过程

    该问题遇到N次,被郁闷N次,特此记录以备不时之需 由于n久不用em,而本机在公司使用dhcp自动获取ip,导致ip变化,而使em启动报出ora-12514 DBD ERROR: OCIServerAt ...

  9. BZOJ 1066 蜥蜴 最大流

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1066 题目大意: 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥 ...

  10. python第三课——数据类型2

    day03: 1.列表:list 特点:有序的(有索引.定义和显示顺序是一致的).可变的(既可以改变元素内容也可以自动扩容).可重复的. 可以存储任何的数据类型数据 定义个列表如下: lt = ['宋 ...