27 getcwd 的调试

前言

同样是一个 很常用的 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 的函数调用 

27 getcwd 的调试_第1张图片

getcwd 的实现如下 

默认的处理是直接基于 getcwd 的系统调用 

如果名称超长, 则基于 generic_getcwd 来获取当前路径 

27 getcwd 的调试_第2张图片

27 getcwd 的调试_第3张图片

generic_getcwd 是基于 proc 文件系统, 获取 proc 文件系统下的 当前进程存储的 cwd 

27 getcwd 的调试_第4张图片

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" 上面

27 getcwd 的调试_第5张图片

这里的处理是 当前路径的 dentry 向上开始遍历, 直到碰到 根节点 

然后 将这一系列的路径输出到 buffer 中 

27 getcwd 的调试_第6张图片

你可能感兴趣的:(20,linux,glibc,vfs,getcwd)