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

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

学习pwd命令

通过man pwd命令查看

989c0a3ea8b7fad04061dc38c4e0677e.png

pwd [OPTION],一般不加参数

-P显示当前目录的物理路径

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

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

系统调用

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

0fe5cf53d7db57e1793ecbefcac58afc.png

这里有两个系统调用可能用到pwd中

getcwd()

61a8101b9e6fb6f20cfceead992703ad.png

功能:获取当前目录

参数

char *buf:存储当前路径的字符串

size_t size:buf的空间大小

返回值: 成功则返回指向当前路径字符串的指针,错误则返回NULL

readdir()

67d1ccf9d8cc85c437cb3d4a48df92c6.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()

54007bdbb44fa8cd6f7290696da0fc89.png

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

参数:路径名

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

chdir()

03c61e8e90c8bac43177da33a6dbf580.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

#include

#define MAXPATH 50

int main()

{

char path[MAXPATH];

puts(getcwd(path, MAXPATH));

return 0;

}

使用readdir()

#include

#include

#include

#include

#include

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

40fd6134e28c881da32b8cba1df8425d.png

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

90f96c3a48412e7e86f47ac464ecceac.png

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 ...

随机推荐

直播推流端弱网优化策略 | 直播 SDK 性能优化实践

弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...

extern c

extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C+ ...

Java父类子类的对象初始化过程

摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和 ...

Nginx的Upload上传模块

前段时间做一个项目,需要上传文件,差不多需要20M左右,普通用php处理会比较麻烦,经常超时,而且大量占用资源.于是搜索了下,决定用nginx的upload上传模块来处理. 你可以在这里:http:/ ...

MySql事务无法回滚的原因

使用MySQL时.假设发现事务无法回滚,但Hibernate.Spring.JDBC等配置又没有明显问题时.不要苦恼,先看看MySQL创建的表有没有问题.即表的类型. InnoDB和MyISAM是在使 ...

iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现

项目地址 :  https://github.com/zhonggaorong/QQLoginDemo/tree/master 最新版本的qq登录实现步骤实现: 1. 首先,你需要去向腾讯申请账号. ...

GCD API记录(二)

前言 这是关于GCD的第二篇文章,GCD的API有100多个,通过快捷键Option + 单击,可以在Reference中的Grand Central Dispatch (GCD) Reference ...

mysql表管理

4.1 查看所有表 查看所有表语句: show tables; 例: mysql> show tables; +-----------------+ | Tables_in_emp | +--- ...

简单的windows窗口创建实例

#include #include LRESULT CALLBACK WndProc(HWND hwnd,UINT umsg,WPARA ...

Android 编程下实现 Activity 的透明效果

实现方式一(使用系统透明样式) 通过配置 Activity 的样式来实现,在 AndroidManifest.xml 找到要实现透明效果的 Activity,在 Activity 的配置中添加如下的代 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值