前言
同样是一个 很常用的 glibc 库函数
不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 获取当前路径
不过 我们这里是从 具体的实现 来看一下
测试用例
就是简单的使用了一下 getcwd
root@ubuntu:~/Desktop/linux/HelloWorld# cat Test04Getcwd.c
#include "stdio.h"
int main(int argc, char** argv) {
int x = 2;
int y = 3;
int z = x + y;
char* p1 = (char*) malloc(40);
printf("p1 : 0x%x\n", p1);
getcwd(p1, 100);
int p1Len = strlen(p1);
printf(" p1 = %s, p1Len = %d\n ", p1, p1Len);
}
getcwd 的实现
首先确认一下 断点的位置, 位于 main 中的 getcwd 的函数调用
getcwd 的实现如下
默认的处理是直接基于 getcwd 的系统调用
如果名称超长, 则基于 generic_getcwd 来获取当前路径
generic_getcwd 是基于 proc 文件系统, 获取 proc 文件系统下的 当前进程存储的 cwd
root@ubuntu:~/Desktop/linux/HelloWorld# ll /proc/5753/cwd
lrwxrwxrwx 1 root root 0 Nov 25 23:39 /proc/5753/cwd -> /root/Desktop/linux/HelloWorld/
getcwd 的系统调用
getcwd 系统调用如下, 这里的当前路径为 "/jerry/dir"
其中硬盘 "/dev/sda1" 挂载到了 "/jerry" 上面
这里的处理是 当前路径的 dentry 向上开始遍历, 直到碰到 根节点
然后 将这一系列的路径输出到 buffer 中
完