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

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

学习pwd命令

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

系统调用

  • 使用man -k dir | grep 2命令查看有哪些跟pwd相关的系统调用
    1043723-20171119155827593-910559468.png
  • 这里有两个系统调用可能用到pwd中
    • getcwd()1043723-20171119160118124-697451825.png
      • 功能:获取当前目录
      • 参数
        • char *buf:存储当前路径的字符串
        • size_t size:buf的空间大小
      • 返回值: 成功则返回指向当前路径字符串的指针,错误则返回NULL
    • readdir()1043723-20171119160245765-581110364.png
      • 功能: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()1043723-20171119173020577-1446520772.png
      • 功能:opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值
      • 参数:路径名
      • 返回值:成功则返回DIR* 型态的目录流,打开失败则返回NULL。
    • chdir()1043723-20171120004957984-150079084.png
      • 功能:切换当前目录
      • 参数:路径名

伪代码

  • 使用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
    1043723-20171119161833296-1962574973.png
  • 实现二:使用readdir()实现pwd
    1043723-20171120010034881-1166538675.png

码云链接

转载于:https://www.cnblogs.com/dky20155212/p/7862211.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值