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

学习pwd命令

  • 通过man pwd命令查看
  • pwd [OPTION],一般不加参数
    • -P显示当前目录的物理路径
    • -L显示当前目录的连接路径
  • 该命令用来显示目前所在的工作目录。指令英文原义:print work directory

系统调用

  • 使用man -k dir | grep 2命令查看有哪些跟pwd相关的系统调用

  • 这里有两个系统调用可能用到pwd中
    • getcwd()

      • 功能:获取当前目录
      • 参数
        • char *buf:存储当前路径的字符串
        • size_t size:buf的空间大小
      • 返回值: 成功则返回指向当前路径字符串的指针,错误则返回NULL
    • readdir()
      • 功能:readdir()返回参数dir目录流的下个目录进入点
      • 参数:DIR * dir。结构dirent定义如下:
        struct dirent{
        ino_t d_ino;//此目录进入点的inode
        off_t d_off;//目录文件开头至此目录进入点的位移
        unsigned short int d_reclen;//记录的长度
        unsigned char d_type;//文件类型
        char d_name[256];
        };
      • 返回值:成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL
  • 但是发现readdir()不能单独使用,
    • opendir()

      • 功能:opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值
      • 参数:路径名
      • 返回值:成功则返回DIR* 型态的目录流,打开失败则返回NULL。
    • chdir()
      • 功能:切换当前目录
      • 参数:路径名

伪代码

  • 使用getcwd()
定义数组buf[MAXPATH];
调用getcwd(buf, MAXPATH);
输出返回值;
  • 使用readdir()
while(1)
{
读取"."和".."的信息
if("."的inode==".."的inode)
{
退出;
}
else
{
chdir("..");
while(dirent->inode!=前面"."的inode)
{
dirent=readdir();
}
dirent->name入栈;
}
}
for 栈顶->栈底
print 栈顶信息

产品代码

  • 使用getcwd()
#include <stdio.h>
#include <unistd.h>
#define MAXPATH 50 int main()
{
char path[MAXPATH];
puts(getcwd(path, MAXPATH));
return 0;
}
  • 使用readdir()
#include <stdio.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h> int main()
{ DIR *dirptr=NULL;
struct dirent *current_dirent=NULL, *parent_dirent=NULL, *tmp_dirent=NULL;
int count=0;
ino_t current_inode;
char path[256][256]; while(1)
{
dirptr=opendir(".");
do
{
current_dirent=readdir(dirptr);
}while(strcmp(current_dirent->d_name, ".")!=0);
current_inode=current_dirent->d_ino;
closedir(dirptr);
dirptr=opendir(".");
do
{
parent_dirent=readdir(dirptr);
}while(strcmp(parent_dirent->d_name, "..")!=0);
closedir(dirptr);
if(((long)parent_dirent->d_ino)==((long)current_dirent->d_ino))
{
break;
}
else
{
chdir("..");
dirptr=opendir(".");
do
{
tmp_dirent=readdir(dirptr);
}while(tmp_dirent->d_ino!=current_inode);
closedir(dirptr);
count++;
strcpy(path[count], tmp_dirent->d_name);
}
}
int i;
for(i=count;i>0;i--)
{
printf("/%s", path[i]);
}
printf("\n"); return 0;
}

测试

  • 实现一:使用getcwd()实现pwd

  • 实现二:使用readdir()实现pwd

码云链接

20155212 C语言实现linux下pwd命令的两种方法的更多相关文章

  1. Linux 下操作GPIO(两种方法,驱动和mmap)(转载)

    目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...

  2. Linux 下操作gpio(两种方法,驱动和mmap)

    目前我所知道的在linux下操作GPIO有两种方法: 1.  编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...

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

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

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

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

  5. Linux下进程通信的八种方法

    Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...

  6. python执行linux命令的两种方法

    python执行linux命令有两种方法: 在此以Linux常用的ls命令为例: 方法一:使用os模块 1 2 3 shell# python >> import os >> ...

  7. Linux系统实现虚拟内存有两种方法:交换分区(swap分区)和交换文件

    Linux系统实现虚拟内存有两种方法:交换分区(swap分区)和交换文件 交换文件 查看内存:free -m , -m是显示单位为MB,-g单位GB 创建一个文件:touch /root/swapfi ...

  8. Linux下ps命令详解 Linux下ps命令的详细使用方法

    http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...

  9. linux 下部署nodejs(两种方式)

    本次博客的编写时用的系统环境,刚装好的Centos 6.4  64位虚拟机. 另外关于linux 其他系统的安装 可以参考https://github.com/joyent/node/wiki/Ins ...

随机推荐

  1. Docker 网络基础介绍

    [编者按]本文作者为 Mesosphere 开发大使 Michael Hausenblas,主要介绍配置 Docker 单主机网络的基本知识.文章系国内 ITOM 管理平台 OneAPM 编译呈现. ...

  2. 2.Servlet基础总结

    一.简介 1.什么是Servlet Servlet(Server Applet),全称Java Servlet,未有中文译文.是用Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成 ...

  3. python之系统命令

    subprocess执行系统命令 call:执行命令,返回状态码 #!/usr/bin/env python # _*_ coding:utf-8 _*_ __Author__ = 'KongZhaG ...

  4. asar 如何解密加密?electron 的 asar 的具体用法

    来源:https://newsn.net/say/electron-asar.html 在electron中,asar是个特殊的代码格式.asar包里面包含了程序猿编写的代码逻辑.默认情况下,这些代码 ...

  5. [控件] LineAnimationView

    LineAnimationView 效果 说明 水平循环无间隔播放动画效果,用于loading的界面 源码 https://github.com/YouXianMing/UI-Component-Co ...

  6. 16:42 python历史

    python的作者是Guido van Rossum,大牛,2.7版本好像到2020年就不能用了,估计很多公司对此有很多的需求吧.

  7. 简单的dp加贪心

    题目链接:传送门 这个题目让我纠结了好久,之后恍然大悟是求最长的递减序列,并加上贪心的算法,如果有大于两个的发射系统,应该判断使导弹的高度与此时个个发射系统的高度比较,选取高度差最小的去执行这次的拦截 ...

  8. Java使用HTTP编程模拟多参数多文件表单信息的请求与处理

    本文目的是提供Java环境下模拟浏览器页面提交多参数多文件表单请求以及解析请求的Demo代码.这里用Java提供的HttpURLConnection类做HTTP请求,再原始点可以直接使用socket. ...

  9. ant jmeter jenkins 实现自动化测试

    编者按: 本文核心的关键是ant去调用build.xml 执行自动化测试任务. bulid.xml 文件的内容按照注释修改为你自己服务器相关信息. 配置完成后一定要手动在服务器上执行一次,确保你配置的 ...

  10. 判断浏览器是否为ie的最快方法

    var ie = !-[1,]; alert(ie); 只要6 bytes!它利用了IE与标准浏览器在处理数组的toString方法的差异做成的.对于标准游览器,如果数组里面最后一个字符为逗号,JS引 ...