转自:http://www.cnblogs.com/alan-forever/p/3721908.html

通过getcwd()可以获取当前工作目录。

1 #include <unistd.h>
2
3 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()为错误处理函数。。。。

  1 /*2  * =====================================================================================3  *4  *       Filename:  18.5.c5  *6  *    Description:  7  *8  *        Version:  1.09  *        Created:  2014年05月11日 14时04分35秒10  *       Revision:  none11  *       Compiler:  gcc12  *13  *         Author:  alan (), alan19920626@gmail.com14  *   Organization:  15  *16  * =====================================================================================17  */18 19 #include <sys/stat.h>20 #include <fcntl.h>21 #include <dirent.h>22 #include <sys/types.h>23 #include "tlpi_hdr.h"24 25 #define BUF_MAX 409626 27 extern int errno; 28 29 char *Getcwd(char *cwdbuf, size_t size){30     char path[BUF_MAX], cwd[BUF_MAX];31     DIR *dirp;32     struct dirent *dp;33     struct stat sb, sb_d, sb_1;34     dev_t dev;35     ino_t ino;36 37     while(1){38         //获取当前目录的文件信息39         if(stat(".", &sb) == -1)40             errExit("stat");41         dev = sb.st_dev;42         ino = sb.st_ino;43 44         //获取父目录的对应的目录流和父目录的文件信息45         if((dirp = opendir("..")) == NULL)46             errExit("opendir");47         if(stat("..", &sb_1) == -1)48             errExit("stat");49 50         //判断当前目录是否与父目录相同51         if(sb_1.st_dev == dev && sb_1.st_ino == ino)52             break;53 54         errno = 0;55         56         //在父目录对应的目录流读取条目57         while((dp = readdir(dirp)) != NULL){58             snprintf(path, BUF_MAX, "../%s", dp->d_name);59 60             if(stat(path, &sb_d) == -1)61                 errExit("stat");62 63             //得到当前目录对应的条目并将目录逐渐完善64             if(dev == sb_d.st_dev && ino == sb_d.st_ino){65                 memset(cwd, 0, sizeof(cwd));66                 if(strcat(cwd, "/") == NULL)67                     errExit("strcat");68                 if(strcat(cwd, dp->d_name) == NULL)69                     errExit("strcat");70                 if(strcat(cwd, cwdbuf) == NULL)71                     errExit("strcat");72 73                 if(strncpy(cwdbuf, cwd, BUF_MAX) == NULL)74                     errExit("strncpy");75                 break;76             }77             78         }79 80         if(dp == NULL && errno != 0)81             errExit("readdir");82 83         closedir(dirp);84         chdir("..");      //改变当前目录85     }86 87     return cwdbuf;88 }89 90 int main(int argc, char *argv[]){91     char buf[BUF_MAX];92     char t_buf[BUF_MAX];93     char *p;94     int fd;95 96     if((fd = open(".", O_RDONLY)) == -1)97         errExit("open");98 99     if(argc != 1)
100         usageErr("%s", argv[0]);
101
102     p = Getcwd(buf, BUF_MAX);
103     if(p == NULL)
104         errExit("My getcwd");
105     printf("My getcwd: %s\n", p);
106     fchdir(fd);    //遣回最初的目录
107
108     p = getcwd(t_buf, BUF_MAX);
109     if(p == NULL)
110         errExit("getcwd");
111     printf("getcwd: %s\n", p);
112
113     exit(EXIT_SUCCESS);
114 }

测试结果:

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 头文件,linux – rsync:getcwd():没有这样的文件或目录(2)

    我想将Server1和Server2的日志同步到LogServer. 对于Server1: rsync -avz -e 'ssh -p 2188' user@server1:/usr/local/se ...

  2. strcat函数oracle,实现strcat函数

    关于C语言字符串函数使用的一点心得 就字符串的拼接函数为例strcat. 原型:extern char *strcat(char *dest,char *src);用法:#include <st ...

  3. linux之getcwd函数解析,如何在Linux 中使用getcwd()函数

    如何在Linux 中使用getcwd()函数 发布时间:2021-03-15 17:35:21 来源:亿速云 阅读:106 作者:Leah 这期内容当中小编将会给大家带来有关如何在Linux 中使用g ...

  4. linux之getcwd函数解析,Linux 中C语言getcwd()函数的用法

    Linux 中C语言getcwd()函数的用法 先来看该函数的声明: #include char *getcwd(char *buf,size_t size); 介绍: 参数说明:getcwd()会将 ...

  5. Linux中glob()、globfree()、getcwd()函数

    Linux中glob()与globfree()函数 文章目录 一.glob()函数 二.globfree()函数 三.getcwd()函数: 四.代码演示 总结 一.glob()函数 glob()函数 ...

  6. (5)Linux基础——opendir/closedir 、readdir、mkdir 、rmdir、getcwd、chdir详细含义用法及介绍(基础)

    一.整体操作 ①打开目录文件:opendir ②读取目录项:readdir ③关闭目录文件:closedir 注意:所需要用到的头文件 #ifndef __HEAD_H__ //防止头文件被重复定义 ...

  7. Linux gcc getcwd()的实现 zhuan

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

  8. Linux终端实现自己的命令解释器----mybash

    首先我们得知道Linux下产生新进程的过程是--->先复制---->再替换子进程(fork + exec) 来看代码  代码中都有解释的 下面代码实现的主要功能就是内置命令cd的简单操作和 ...

  9. linux上使用strace查看C语言级别的php源码【一种方法】

    如果你希望看到C语言级别的php代码就需要使用strace 这个默认是安装了的,如果没有安装可以 #yum install strace 查看httpd进程 #ps auxw | grep httpd ...

最新文章

  1. stream filter_Stream 流实践
  2. python 购物车代码
  3. 分享你的见解与经验|RocketMQ Summit 2022 议题征集中
  4. opencv中的椭圆拟合
  5. php为什么都不想去二次开发,php学习误区:不要盲目的去读程序
  6. 11-散列3 QQ帐户的申请与登陆 (25 分)
  7. 5G的来龙去脉及未来
  8. HDFS 命令深入浅出
  9. 物联网安全漏洞有哪些
  10. 密码强度正则表达式 – 必须包含大写字母,小写字母和数字,至少8个字符等...
  11. 02C++对C的增强
  12. Altium Designer如何批量修改SCH名称,数值,封装
  13. 服务器电脑增加机械硬盘分区,台式电脑加新、旧机械硬盘分区教程 旧机械硬盘可以装新电脑上吗?...
  14. 怎样把gis锯齿边_在arcgis中如何消除锯齿状边缘
  15. php图片地址怎么看,电脑截屏的图片在哪里找
  16. 【信息系统项目管理师】2018下半年信息系统项目管理师考试案例分析
  17. oracle是做什么用的,可以形容下Oracle有什么用,是干什么的吗?
  18. 图片返回base64数据渲染为图片的处理
  19. 第十三章 半监督学习
  20. Python + Excel——飞速处理数据分析与处理

热门文章

  1. 【Git】git add -A = git add . + git add -u
  2. WebKit如何加载web页面
  3. SQL注入原理深度解析
  4. 解决Ubuntu Pycharm无法输入中文
  5. Java并发—线程池ThreadPoolExecutor基本总结
  6. List类系列(二):List类的list()方法
  7. 处理JS中数据失真问题-随笔
  8. linux系统编程:自己动手写一个who命令
  9. 一道超级复杂的js题目
  10. IOS开发中常量的处理