getcwd()的实现

通过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 (), [email protected]
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 }

测试结果:

[email protected]:~/Code/tlpi$ pwd
/home/lancelot/Code/tlpi
[email protected]:~/Code/tlpi$ ./18.5
My getcwd: /home/lancelot/Code/tlpi
getcwd: /home/lancelot/Code/tlpi

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

getcwd()的实现,布布扣,bubuko.com

时间: 2024-10-08 04:02:49

getcwd()的实现的相关文章

文件权限控制篇access alphasort chdir chmod chown chroot closedir fchdir fchmod fchown fstat ftruncate getcwd

access(判断是否具有存取文件的权限) 相关函数 stat,open,chmod,chown,setuid,setgid 表头文件 #include<unistd.h> 定义函数 int access(const char * pathname,int mode); 函数说明 access()会检查是否可以读/写某一已存在的文件.参数mode有几种情况组合,R_OK,W_OK,X_OK 和F_OK.R_OK,W_OK与X_OK用来检查文件是否具有读取.写入和执行的权限.F_OK则是用来判断

8Linux服务器编程之:chdir()函数和cd命令,getcwd()函数和pwd

 1chdir依赖的头文件 #include<unistd.h> 2函数定义 int chdir(const char *path); int fchdir(int fd); 函数说明: chdir的作用是改变工作目录 4getcwd依赖的头文件 #include<unistd.h> 5函数定义: char *getcwd(char *buf, size_t size); 函数说明,通过这个函数获得路径 6.案例说明: 7.pathconf依赖的头文件 #include<

通过__DIR__和 getcwd()的不同之处来剖析像ThinkPHP等单一入口文件类框架模式

__DIR__,PHP5.3的全局预定义常量,为当前文件的所在目录的绝对路径形式的表示,类似的还有__FILE__,为访问本文件的绝对路径. getcwd()为get current working directory,即当前执行的脚本的目录位置,何为当前执行的脚本. index.php <?php     require_once('lib/init.php'); ?> lib/ init.php <?php     echo __DIR__;     echo '<br/>

获取当前目录getcwd,设置工作目录chdir,获取目录信息

#include <unistd.h> #include <stdio.h> #include <limits.h> int main(int argc, char* argv[]) { char buf[PATH_MAX]; getcwd(buf, PATH_MAX-1); printf("the current path is :%s\n", buf); return 0; } 设置工作目录: #include <unistd.h>

Linux getcwd()的实现【转】

转自: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()相当的函数.提示:要获取当

Linux gcc getcwd()的实现 zhuan

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

文件和目录详解(十)---chdir和getcwd函数详解

对于每个进程来说,都有一个当前工作目录,进程中所有的相对文件路径名都会以这个当前工作目录为起始点.一般来说,默认的当前工作目录就是创建进程时所处的目录. 使用 chdir 函数可以修改进程的当前工作目录,使用 getcwd 函数可以用来获取当前工作目录的绝对路径名. ===================================================== 函数原型: 函数参数: path:要修改的目录路径 返回值: 调用成功时返回 0 调用失败时返回 -1 ==========

函数chdir、fchdir和getcwd

函数chdir.fchdir和getcwd chdir.fchdir函数 每个进程都有一个当前工作目录,当前目录是进程的一个属性 当用户登录UNIX系统时,其当前工作目录通常是口令文件/etc/passwd中该用户登录项的第6个字段 进程调用chdir或fchdir函数可以更改当前工作目录 #include <unistd.h> int chdir(const char *pathname); int fchdir(int fd); Both return: 0 if OK, ?1 on er

getcwd

#include <unistd.h> char *getcwd(char *buf, size_t size); 作用:把当前目录的绝对地址保存到 buf 中,buf 的大小为 size.如果 size太小无法保存该地址,返回 NULL 并设置 errno 为 ERANGE. 可以采取令 buf 为 NULL并使 size 为负值来使 getcwd 调用 malloc 动态给 buf 分配,但是这种情况要特别注意使用后释放缓冲以防止内存泄漏. 程序例如果在程序运行的过程中,目录被删除(EIN