改变工作目录和根目录
进程有工作目录和根目录。
工作目录:进程在哪个路径下被运行起来哪个路径就是进程的工作目录(Current Woring Directory, CWD)
根目录:就是”/“
工作目录和根目录可以通过/proc/PID/cwd
和/proc/PID/root
进行查看
工作目录和根目录都可以进行更改,获取进程当前工作目录和改变进程工作目录的函数分别是:
1 |
|
buf
参数指向的内存用于存储进程当前工作目录的绝对路径名,其大小由size
参数指定。
如果当前工作目录的绝对路径的长度(再加上一个空结束字符“\0”)超过了size
,则getcwd
将返回NULL
,并设置errno
为ERANGE
。
如果buf
为NULL
并且size
非0,则getcwd
可能在内部使用malloc
动态分配内存,并将进程的当前工作目录存储在其中。如果是这种情况,则我们必须自己来释放getcwd
在内部创建的这块内存。
getcwd
函数成功时返回一个指向目标存储区(buf
指向的缓存区或是getcwd
在内部动态创建的缓存区)的指针,失败则返回NULL
并设置errno
。
chdir
函数的path
参数指定要切换到的目标目录。它成功时返回0,失败时返回-1并设置errno
。
改变进程根目录可以使用chroot
:
1 |
|
path
参数指定要切换到的目标根目录。它成功时返回0,失败时返回-1并设置errno
。
chroot
并不改变进程的当前工作目录。
改变进程的根目录之后,程序可能无法访问类似/dev
的文件(和目录),因为这些文件(和目录〉并非处于新的根目录之下。不过好在调用chroot
之后,进程原先打开的文件描述符依然生效,所以我们可以利用这些早先打开的文件描述符来访问调用chroot
之后不能直接访问的文件(和目录),尤其是一些日志文件。此外,只有特权进程才能改变根目录。