通过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

吐槽&收获:本来打算慢慢通过写学习记录,但是觉得学习很多只是通过把一些重点写出来和一些习题,所以打算放一放,有空再写。重点什么的还要慢慢总结。先把一些习题做了,顺便结合之前学得系统调用和库函数做一些实际的东西先。。。。。。一个下午做这么一条题。。。真心弱菜,不过做出来真得很开心。。。。。还有慢慢长路要走!!!继续努力!!!

最新文章

  1. 8个免费实用的C++GUI库(转载)
  2. 关于cookie的清除
  3. java 最佳且开源的反编译工具
  4. linq query, using int.parse to convert varchar to int while orderby
  5. php代码优化技巧
  6. CodeAssistant
  7. Sencha Touch 2 在MAC下详细的开发流程
  8. Alyona and flowers
  9. centos7 Failed to start firewalld.service: Unit is masked.
  10. 实战Google深度学习框架-C3-TensorFlow入门
  11. 十.nginx反向代理负载均衡服务实践部署
  12. JS变量的提升详解
  13. Kotlin的参考资料
  14. Nginx之编译安装的nginx加入systemctl
  15. vue-devtools/安装vue-devtools
  16. Python - Django - 登录页面
  17. 如何在Linux中用命令行工具管理KVM虚拟环境
  18. 基于jQuery日历插件制作日历
  19. UVA 11542 高斯消元
  20. Qt WebRTC demo

热门文章

  1. July 22nd 2017 Week 29th Saturday
  2. bzoj1434 [ZJOI2009]染色游戏
  3. 【[POI2006]OKR-Periods of Words】
  4. ICompare 可比较接口
  5. MATLAB 中gcf、gca 以及gco 的区别
  6. js获取给定时间的下一天
  7. springboot项目pom添加依赖
  8. 【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)
  9. HDU 1248 寒冰王座 (完全背包)
  10. OpenCV 中CV_IMAGE_ELEM 的使用