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这个 ...
随机推荐
- MS15-051 修正版Exploit(Webshell可用)
MS15-051简介:Windows 内核模式驱动程序中的漏洞可能允许特权提升 (3057191) , 如果攻击者在本地登录并可以在内核模式下运行任意代码,最严重的漏洞可能允许特权提升. 攻击者可随后 ...
- 显卡 GPU 关系
https://zhidao.baidu.com/question/1238935513507031339.htmlGraphic Processing Unit,意思就是图形处理器啊,显卡的由GPU ...
- Sublime Text 3中关闭记住上次打开的文件
使用UltraEdit的时候,每次安装后就得修改一堆配置,其中一项便是关闭“打开上一次未关闭的文件”,Sublime Text 2也有这么一个默认的功能,在实际使用中,这种方式确实可以较快速的访问文件 ...
- HDU 6395 Sequence 【矩阵快速幂 && 暴力】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6395 Sequence Time Limit: 4000/2000 MS (Java/Others) ...
- 解决 git pull 报错 fatal: refusing to merge unrelated histories
我在Github新建一个仓库,写了License,然后把本地一个写了很久仓库上传. 先pull,因为两个仓库不同,发现refusing to merge unrelated histories,无法p ...
- 启动memcache
"D:\SOFT\memcached-1.4.5-amd64\memcached-amd64\memcached.exe"
- Swift:一个基于.NET Core的分布式批处理框架
Swift是什么 从文章的标题可知:此Swift非Apple那个Swift,只是考虑这个词的含义比较适合. Swift是一个基于.NET Core的分布式批处理框架,支持将作业分割后分发到多台服务器并 ...
- Python(一)数据结构和算法的20个练习题问答
数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典.大多数情况下使用这些数据结构是很简单的. 但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题. 因此,这 ...
- My collage goals
PART ONE: THE GOALS OF GRADE ONE 1, Try my best to improve my GPA , keep it around 4.0 2, Learn mor ...
- 『ACM C++』 Codeforces | 1066A - Points in Segments
大一生活真 特么 ”丰富多彩“ ,多彩到我要忙到哭泣,身为班长,很多班级的事情需要管理,也是,什么东西都得体验学一学,从学生会主席.团委团总支.社团社长都体验过一番了,现在差个班长也没试过,就来体验了 ...