0%

改变工作目录和根目录

改变工作目录和根目录

进程有工作目录和根目录。

工作目录:进程在哪个路径下被运行起来哪个路径就是进程的工作目录(Current Woring Directory, CWD)

根目录:就是”/“

工作目录和根目录可以通过/proc/PID/cwd/proc/PID/root进行查看

image-20220821175748810

工作目录和根目录都可以进行更改,获取进程当前工作目录和改变进程工作目录的函数分别是:

1
2
3
4
#include <unistd.h>

char *getcwd(char *buf, size_t size);
int chdir(const char *path);

buf参数指向的内存用于存储进程当前工作目录的绝对路径名,其大小由size参数指定。

如果当前工作目录的绝对路径的长度(再加上一个空结束字符“\0”)超过了size,则getcwd将返回NULL,并设置errnoERANGE

如果bufNULL并且size非0,则getcwd可能在内部使用malloc动态分配内存,并将进程的当前工作目录存储在其中。如果是这种情况,则我们必须自己来释放getcwd在内部创建的这块内存。

getcwd函数成功时返回一个指向目标存储区(buf指向的缓存区或是getcwd在内部动态创建的缓存区)的指针,失败则返回NULL并设置errno

chdir函数的path参数指定要切换到的目标目录。它成功时返回0,失败时返回-1并设置errno

改变进程根目录可以使用chroot:

1
2
3
#include <unistd.h>

int chroot(const char *path);

path参数指定要切换到的目标根目录。它成功时返回0,失败时返回-1并设置errno

chroot并不改变进程的当前工作目录。

改变进程的根目录之后,程序可能无法访问类似/dev的文件(和目录),因为这些文件(和目录〉并非处于新的根目录之下。不过好在调用chroot之后,进程原先打开的文件描述符依然生效,所以我们可以利用这些早先打开的文件描述符来访问调用chroot之后不能直接访问的文件(和目录),尤其是一些日志文件。此外,只有特权进程才能改变根目录。