转自: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.c
5 *
6 * Description:
7 *
8 * Version: 1.0
9 * Created: 2014年05月11日 14时04分35秒
10 * Revision: none
11 * Compiler: gcc
12 *
13 * Author: alan (), alan19920626@gmail.com
14 * 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 4096
26
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()的实现

    通过getcwd()可以获取当前工作目录. #include <unistd.h> char *getcwd(char *cwdbuf, size_t size); 成功调用返回指向cwd ...

  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. python Re库的介绍

    re库的贪婪匹配和最小匹配 后面跟着?变为最小匹配

  2. [bzoj2733]永无乡&&[bzoj3545]Peaks

    并不敢说完全会了线段树合并,只是至少知道原理写法了...还是太菜了,每天被大佬吊锤qwq 我看到的几道线段树合并都是权值线段树的合并.这个算法适用范围应该只是01线段树的. 这两道算入门题了吧... ...

  3. mybatis异常:There is no getter for property named 'xxx' in 'xxx'

    在使用mybatis查询的时候出现了下面的异常: org.apache.ibatis.reflection.ReflectionException: There is no getter for pr ...

  4. 滑动菜单栏之开源项目SlidingMenu的使用

    一.SlidingMenu简介 相信大家对SlidingMenu都不陌生了,它是一种比较新的设置界面或配置界面的效果,在主界面左滑或者右滑出现设置界面效果,能方便的进行各种操作.很多优秀的应用都采用了 ...

  5. Python 3基础教程3-数学运算

    本文来介绍下Python中的常见数学运算,其实和其他语言一样,加减乘除语法差不多,这里注意下Python中指数的表示方法. # 这里介绍 常见的数学运算 # 加法print(5 + 8) # 减法pr ...

  6. 孤荷凌寒自学python第六天 列表的嵌套与列表的主要方法

    孤荷凌寒自学python第六天 列表的嵌套与列表的主要方法 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) (同步的语音笔记朗读:https://www.ximalaya.com/keji/1 ...

  7. Wordpress 后台文章编辑区添加模板选择功能

    功能:后台编辑文章时,可以选择文章使用的模板,效果如下图: 操作步骤: <?php /** * Template Name: kbsingle full * Add by Ryan 3/18/2 ...

  8. NYOJ36 水池数目

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...

  9. 第八章 Internet控制报文协议

    Internet控制报文协议 首先,我们必须先清楚,IP协议本身没有为终端系统提供直接的方法来发现那些发往目的地址失败的IP数据包,并且IP没有提供直接的方式来获取诊断信息,那么我们的故事来了. In ...

  10. BZOJ2957 楼房重建 【线段树】

    题目 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个二维 ...