Linux getcwd()的实现
通过getcwd()可以获取当前工作目录。
#include <unistd.h> char *getcwd(char *cwdbuf, size_t size);
成功调用返回指向cwdbuf的指针,失败返回NULL。
getcwd()的实现是《Linux/Unix系统编程手册》的练习18.5,题目如下:
实现一个功能与getcwd()相当的函数。提示:要获取当前工作目录的名称,可调用opendir()和readdir()来遍历其父目录(..)中的各个条目,查找其中与当前工作目录具有相同i-node编号及设备号的一项。如此这般,沿着目录树层层拾级而上(chdir(..))并进行扫描,就能构建出完整的目录路径。当前目录与当前工作目录相同时,就结束遍历。无论调用该函数成功与否,都应将调用者遣回其起始目录(使用open()和fchdir()能方便地实现这一功能)
1、通过stat获取文件信息,根据文件信息中的i-node编号和设备号来找到正确的目录
2、运用opendir()、readdir()来获取目录的信息,目录不能通过read()来获取信息。
PS:tlpi_hdr.h头文件为《Linux/Unix系统编程手册》的头文件,可以去作者的网站下载,其中的errExit()为错误处理函数。。。。
/*
* =====================================================================================
*
* Filename: 18.5.c
*
* Description:
*
* Version: 1.0
* Created: 2014年05月11日 14时04分35秒
* Revision: none
* Compiler: gcc
*
* Author: alan (), alan19920626@gmail.com
* Organization:
*
* =====================================================================================
*/ #include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/types.h>
#include "tlpi_hdr.h" #define BUF_MAX 4096 extern int errno; char *Getcwd(char *cwdbuf, size_t size){
char path[BUF_MAX], cwd[BUF_MAX];
DIR *dirp;
struct dirent *dp;
struct stat sb, sb_d, sb_1;
dev_t dev;
ino_t ino; while(){
//获取当前目录的文件信息
if(stat(".", &sb) == -)
errExit("stat");
dev = sb.st_dev;
ino = sb.st_ino; //获取父目录的对应的目录流和父目录的文件信息
if((dirp = opendir("..")) == NULL)
errExit("opendir");
if(stat("..", &sb_1) == -)
errExit("stat"); //判断当前目录是否与父目录相同
if(sb_1.st_dev == dev && sb_1.st_ino == ino)
break; errno = ; //在父目录对应的目录流读取条目
while((dp = readdir(dirp)) != NULL){
snprintf(path, BUF_MAX, "../%s", dp->d_name); if(stat(path, &sb_d) == -)
errExit("stat"); //得到当前目录对应的条目并将目录逐渐完善
if(dev == sb_d.st_dev && ino == sb_d.st_ino){
memset(cwd, , sizeof(cwd));
if(strcat(cwd, "/") == NULL)
errExit("strcat");
if(strcat(cwd, dp->d_name) == NULL)
errExit("strcat");
if(strcat(cwd, cwdbuf) == NULL)
errExit("strcat"); if(strncpy(cwdbuf, cwd, BUF_MAX) == NULL)
errExit("strncpy");
break;
} } if(dp == NULL && errno != )
errExit("readdir"); closedir(dirp);
chdir(".."); //改变当前目录
} return cwdbuf;
} int main(int argc, char *argv[]){
char buf[BUF_MAX];
char t_buf[BUF_MAX];
char *p;
int fd; if((fd = open(".", O_RDONLY)) == -)
errExit("open"); if(argc != )
usageErr("%s", argv[]); p = Getcwd(buf, BUF_MAX);
if(p == NULL)
errExit("My getcwd");
printf("My getcwd: %s\n", p);
fchdir(fd); //遣回最初的目录 p = getcwd(t_buf, BUF_MAX);
if(p == NULL)
errExit("getcwd");
printf("getcwd: %s\n", p); exit(EXIT_SUCCESS);
}
测试结果:
lancelot@debian:~/Code/tlpi$ pwd
/home/lancelot/Code/tlpi
lancelot@debian:~/Code/tlpi$ ./18.5
My getcwd: /home/lancelot/Code/tlpi
getcwd: /home/lancelot/Code/tlpi
吐槽&收获:本来打算慢慢通过写学习记录,但是觉得学习很多只是通过把一些重点写出来和一些习题,所以打算放一放,有空再写。重点什么的还要慢慢总结。先把一些习题做了,顺便结合之前学得系统调用和库函数做一些实际的东西先。。。。。。一个下午做这么一条题。。。真心弱菜,不过做出来真得很开心。。。。。还有慢慢长路要走!!!继续努力!!!
Linux getcwd()的实现的更多相关文章
- Linux getcwd()的实现【转】
转自:http://www.cnblogs.com/alan-forever/p/3721908.html 通过getcwd()可以获取当前工作目录. 1 #include <unistd.h& ...
- C/C++ Windows移植到Linux
近期写了有关Socket的程序,需要从windows移植到linux.现把有用的东东收集整理记录下来. 1.头文件windows下winsock.h或winsock2.h:linux下netinet/ ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- 20155325 加分作业 实现pwd
要求 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 准备 思路 问题 1.如何获取当前目录的节点号 Linux ...
- linux的getcwd和readlink的区别
针对linux下的程序,有两个路径: 1>运行程序的路径; 2>可执行文件所在的路径 例如: 如果我在/home/yongchao下执行 $ ./temp/test 那么 运行程序的 ...
- linux之getcwd函数解析
[lingyun@localhost getcwd]$ cat getcwd.c /********************************************************** ...
- Linux gcc getcwd()的实现 zhuan
通过getcwd()可以获取当前工作目录. 1 #include <unistd.h> 2 3 char *getcwd(char *cwdbuf, size_t size);
- 软件素材---linux C语言:linux下获取可执行文件的绝对路径--getcwd函数
//头文件:#include <unistd.h> //定义函数:char * getcwd(char * buf, size_t size); //函数说明:getcwd()会将当前的工 ...
- linux服务器开发一 基础
注:本文仅限交流使用,请务用于商业用途,否则后果自负! Linux 1.Linux介绍 Linux是类Unix计算机操作系统的统称. Linux操作系统的内核的名字也是“Linux”. Linux这个 ...
随机推荐
- FireFox浏览器Flash&视频下载工具推荐
介绍 两款扩展组件:Flash and Video Download & Flash Video Downloader 一起使用,各有优缺点. Flash and Video Download ...
- RequireJS进阶-模块的优化及配置的详解
概述 关于RequireJS已经有很多文章介绍过了.这个工具可以将你的JavaScript代码轻易的分割成苦干个模块(module)并且保持你的代码模块化与易维护性.这样,你将获得一些具有互相依赖关系 ...
- Android进阶笔记14:3种JSON解析工具(org.json、fastjson、gson)
一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...
- 使用ViewPager实现Tab
一.效果演示及分析 我们直接看两幅图.如下: 上两幅图实现的效果就是: (1)手指左右滑动时,中间的布局呈现不同的效果.而且下面的按钮也会做相应的改变. (2)我们 ...
- CentOS查看线程、硬盘、内存、cpu、网卡
1.查看硬盘 [mushme@investide ~]$ df -ah 2.查看内存 [mushme@investide ~]$ free -m 3.监控系统的负载 w 查看当前系统的负载,详细 ...
- 轻量级自动化运维工具Fabric的安装与实践
一.背景环境 在运维工作中,经常会遇到重复性的劳动,这个时候为了效率就必须要使用自动化运维工具. 这里我给大家介绍轻量级自动化运维工具Fabric,Fabric是基于Python语言开发的,是开发同事 ...
- Codeforces Round #540 (Div. 3) D1. Coffee and Coursework (Easy version) 【贪心】
任意门:http://codeforces.com/contest/1118/problem/D1 D1. Coffee and Coursework (Easy version) time limi ...
- 学习openGL一——配置环境
openGL支持很多语言,C#, Java, Python, 和Lua.如果你没有使用C/C++,你必须下载和安装一个openGL包或库. 如果你使用了C/C++,你必须先建立一个编译环境,visua ...
- sqlserver事务怎么开启 怎么提交 怎么回滚
1.自动transaction每句statement都是一个transaction.例一个update指令更新多笔纪录, 要就全部成功, 只要失败,全部会回复原值. 2.ExplicitTransac ...
- 【洛谷P1373】小a和uim之大逃离
小a和uim之大逃离 题目链接 因为每次只能向下或向右走,我们可以递推 dp[i][j][d][0/1]表示走到(i,j),mod k 意义下差值为d,轮到小a/小uim操作时的方案数 dp[i][j ...