二、目录相关操作函数
1. 获取当前工作目录:getcwd 函数
函数说明
这个函数可以获取当前进程的工作目录的绝对路径。
-
头文件:
#include <unistd.h> -
函数原型:
char *getcwd(char *buf, size_t size); -
参数:
-
buf:指向存放当前目录路径的数组的指针; -
size:这个数组的大小。
-
-
返回值:
-
成功:返回包含当前工作目录的字符串,如果
buf不为 NULL,就返回buf; -
失败:返回 NULL,并设置
errno。
-
-
特殊情况:如果传入的
buf为 NULL,且size为 0,getcwd会自动调用malloc申请合适大小的内存空间,把路径填进去,然后返回这个内存的地址。注意:这个内存需要调用者自己用free释放。
cpp
#include <common.h>
#include<my_header.h>
int main(int argc, char *argv[]){
char buf[100];
char* cwd=getcwd(buf,sizeof(buf));//只要getcwd调用成功,它会自动在路径最后一个字符后加\0;
ERROR_CHECK(cwd,NULL,"getcwd");
puts(cwd);
printf("%s\n",cwd);//这个printf等价于puts
puts(buf);//getcwd成功时返回的是buf所指向的地址,这个指针指向了一个字符串,字符串存放了当前工作目录的绝对路径
free(cwd);
return 0;
}
2. 改变当前工作目录:chdir 函数
函数说明
这个函数可以改变当前进程的工作目录。
-
头文件:
#include <unistd.h> -
函数原型:
int chdir(const char *path); -
参数:
path:要切换到的目录路径,可以是相对路径或者绝对路径。
-
返回值:
-
成功:返回 0;
-
失败:返回 - 1,并设置
errno。
-
cpp
// func.h,这个头文件可以放到/usr/include目录下,方便后续使用
#ifndef __WD_FUNC_H
#define __WD_FUNC_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define ARGS_CHECK(argc, n) {
if (argc != n) {
fprintf(stderr, "ERROR: expected %d arguments.\n", n);
exit(1);
}
}
#define ERROR_CHECK(retval, val, msg) {
if (retval == val) {
perror(msg);
exit(1);
}
}
#define SIZE(a) (sizeof(a)/sizeof(a[0]))
#endif
// getcwd.c
#include <func.h>
int main(void) {
// 这里我们让系统自动malloc内存
char* cwd = getcwd(NULL, 0);
ERROR_CHECK(cwd, NULL, "getcwd");
puts(cwd);
// 记得释放malloc的内存
free(cwd);
return 0;
}
注意事项
-
当前工作目录是进程的属性,每个进程都有自己的工作目录;
-
父进程创建子进程(fork)的时候,子进程会继承父进程的当前工作目录。