20155212 C语言实现linux下pwd命令的两种方法
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
- getcwd()
- 但是发现readdir()不能单独使用,
- opendir()
- 功能:opendir()用来打开参数name指定的目录,并返回DIR*形态的目录流,和open()类似,接下来对目录的读取和搜索都要使用此返回值
- 参数:路径名
- 返回值:成功则返回DIR* 型态的目录流,打开失败则返回NULL。
- chdir()
- 功能:切换当前目录
- 参数:路径名
- opendir()
伪代码
- 使用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命令的两种方法的更多相关文章
- Linux 下操作GPIO(两种方法,驱动和mmap)(转载)
目前我所知道的在Linux下操作GPIO有两种方法: 1.编写驱动,这当然要熟悉Linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据io ...
- Linux 下操作gpio(两种方法,驱动和mmap)
目前我所知道的在linux下操作GPIO有两种方法: 1. 编写驱动,这当然要熟悉linux下驱动的编写方法和技巧,在驱动里可以使用ioremap函数获得GPIO物理基地址指针,然后使用这个指针根据 ...
- 加分项——C语言实现Linux的pwd命令
加分项--C语言实现Linux的pwd命令 实现要求 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd pwd pw ...
- 20155308 加分项——C语言实现Linux的pwd命令
20155308 加分项--C语言实现Linux的pwd命令 实现要求 学习pwd命令 什么是pwd pwd' 代表的是'Print Working Directory'(打印当前目录).如它的名字那 ...
- Linux下进程通信的八种方法
Linux下进程通信的八种方法:管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量 ...
- python执行linux命令的两种方法
python执行linux命令有两种方法: 在此以Linux常用的ls命令为例: 方法一:使用os模块 1 2 3 shell# python >> import os >> ...
- Linux系统实现虚拟内存有两种方法:交换分区(swap分区)和交换文件
Linux系统实现虚拟内存有两种方法:交换分区(swap分区)和交换文件 交换文件 查看内存:free -m , -m是显示单位为MB,-g单位GB 创建一个文件:touch /root/swapfi ...
- Linux下ps命令详解 Linux下ps命令的详细使用方法
http://www.jb51.net/LINUXjishu/56578.html Linux下的ps命令比较常用 Linux下ps命令详解Linux上进程有5种状态:1. 运行(正在运行或在运行队列 ...
- linux 下部署nodejs(两种方式)
本次博客的编写时用的系统环境,刚装好的Centos 6.4 64位虚拟机. 另外关于linux 其他系统的安装 可以参考https://github.com/joyent/node/wiki/Ins ...
随机推荐
- 在虚拟机中安装ubuntu16.04后不能全屏显示
一.在终端输入:xrandr 二.输入:xrandr -s 1920x1440 参考网站:https://blog.csdn.net/qq_33202928/article/details/75021 ...
- springMVC结合AjaxForm上传文件
最近在项目中需要上传文件文件,之前一直都是form提交的,尝试了一下AjaxForm,感觉还比较好用,写篇随笔mark下,供以后使用. 准备工作: 下载jquery-form.js 相关jar: co ...
- react的基本概念
数据流向 数据的改变发生通常是通过用户交互行为或者浏览器行为(如路由跳转等)触发的,当此类行为会改变数据的时候可以通过 dispatch 发起一个 action,如果是同步行为会直接通过 Reduce ...
- 2.MyBatis 动态SQL
动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格 ...
- Prometheus Node_exporter 之 CPU Memory Net Disk
1. CPU type: GraphUnit: shortmax: "100"min: "0"Label: PercentageSystem - cpu 在内核 ...
- 【gp数据库】OLTP和OLAP区别详解
原来一直使用Oracle,新公司使用greenplum后发现系统的并发性差很多,后来才了解因为Oracle属于OLTP类型,而gp数据库属于OLAP类型的.具体了解如下: 数据库系统一般分为两种类型, ...
- QT的时区转换以及使用注意事项
QDateTime localDate = QDateTime::fromString("2018-12-11 10:40:00", "yyyy-MM-dd hh:mm: ...
- 汽车学习---汽车知识大全【all】
汽车驱动/发动机/大灯 侧方位停车和倒车入库技巧 手动挡车型 换档8大技巧 常见的掉头情况注意事项 最全的左转,右转,待转,掉头方法 开车技巧大汇总,尤其适合新手司机 汽车常识扫盲,不做“汽车小白”! ...
- XGBoost 输出特征重要性以及筛选特征
1.输出XGBoost特征的重要性 from matplotlib import pyplot pyplot.bar(range(len(model_XGB.feature_importances_) ...
- 021.15 IO流 其他流
IO包中的其他类操作基本数据类型:DataInputStream与DataOutputStream操作字节数组:ByteArrayInputStream与ByteArrayOutputStream操作 ...