通过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()的实现的更多相关文章

  1. Linux getcwd()的实现【转】

    转自:http://www.cnblogs.com/alan-forever/p/3721908.html 通过getcwd()可以获取当前工作目录. 1 #include <unistd.h& ...

  2. C/C++ Windows移植到Linux

    近期写了有关Socket的程序,需要从windows移植到linux.现把有用的东东收集整理记录下来. 1.头文件windows下winsock.h或winsock2.h:linux下netinet/ ...

  3. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  4. 20155325 加分作业 实现pwd

    要求 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 准备 思路 问题 1.如何获取当前目录的节点号 Linux ...

  5. linux的getcwd和readlink的区别

    针对linux下的程序,有两个路径: 1>运行程序的路径; 2>可执行文件所在的路径 例如: 如果我在/home/yongchao下执行 $ ./temp/test    那么 运行程序的 ...

  6. linux之getcwd函数解析

    [lingyun@localhost getcwd]$ cat getcwd.c /********************************************************** ...

  7. Linux gcc getcwd()的实现 zhuan

      通过getcwd()可以获取当前工作目录. 1 #include <unistd.h> 2 3 char *getcwd(char *cwdbuf, size_t size);

  8. 软件素材---linux C语言:linux下获取可执行文件的绝对路径--getcwd函数

    //头文件:#include <unistd.h> //定义函数:char * getcwd(char * buf, size_t size); //函数说明:getcwd()会将当前的工 ...

  9. linux服务器开发一 基础

    注:本文仅限交流使用,请务用于商业用途,否则后果自负! Linux 1.Linux介绍 Linux是类Unix计算机操作系统的统称. Linux操作系统的内核的名字也是“Linux”. Linux这个 ...

随机推荐

  1. thuwc2018 爆炸记

    从没考过这么差,必须好好总结一下.. $day1$: 上午到了雅礼洋湖,下午就开始考试.. 食堂饭菜还是很不错的,听说都是雅礼自己垫的? 下午的$day1$爆炸了.. 开考以后看了一下三个题,感觉一开 ...

  2. CentOS下go 安装

     go 语言源码安装依赖 ,gcc ,make glibc库,等,上述工具安装省略,另外,其源代码更新采用的是mercurial 工具,安装前先安装mercureal :   1.mercurial安 ...

  3. ThinkPHP中前台输出变量

    1.   foreach <foreach name="list" item="vo" > {$key}|{$vo.id}:{$vo.name} & ...

  4. HDU 1009 FatMouse' Trade(简单贪心 物品可分割的背包问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1009 FatMouse' Trade Time Limit: 2000/1000 MS (Java/O ...

  5. 【转载】决策树Decision Tree学习

    本文转自:http://www.cnblogs.com/v-July-v/archive/2012/05/17/2539023.html 最近在研究规则引擎,需要学习决策树.决策表等算法.发现篇好文对 ...

  6. IOS 文件名获取简洁方式

    //这里有一个模拟器沙盒路径(完整路径) NSString* index=@"/Users/junzoo/Library/Application Support/iPhone Simulat ...

  7. iOS开发学习资源

    最近想写点关于iOS开发的总结和心得.虽然网上资源一大堆,质量参差不齐,还是推荐一点干货吧! https://www.objc.io/issues/  这个网站的文章质量很高,很多干货,可惜今年已经停 ...

  8. JavaScript高级程序设计(复制变量值、传递参数)

    复制变量值 一个变量向另一个变量复制基本类型值和引用类型值时,是存在不同的. 一个变量向另一个变量复制基本类型的值,会在变量的对象上创建一个新值,然后把该值复制到为新变量分配的位置上. var num ...

  9. Spring注解配置(1)——@Autowired

    @Autowired 注释,它可以对类成员变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 set ,get方法.在使用@Autowired之前,我们对一个b ...

  10. 如何编写及运行JS

    JS也是一种脚本语言,他可以有两种方式在HTML页面进行引入,一种是外联,一种是内部.       外联JS的写法为: <script src="相对路径"></ ...