Linux下fork()函数创建多级目录及路径打印技术咨询
解决用fork+exec实现多级目录创建并打印路径的问题
嘿,我懂你现在的需求——要写一个叫dir123的程序(也就是进程A),通过创建子进程B,把B的镜像换成mkdir -p来创建./D1/D2/D3,然后切换到D3目录打印它的绝对路径对吧?下面直接给你能跑的代码,再一步步拆解每个部分的作用:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <limits.h> int main() { // 创建子进程B pid_t pid = fork(); if (pid == -1) { perror("fork failed"); exit(EXIT_FAILURE); } else if (pid == 0) { // 子进程B:替换镜像为mkdir -p ./D1/D2/D3 // 用execlp会自动在PATH里找mkdir,也可以用execl指定绝对路径/bin/mkdir execlp("mkdir", "mkdir", "-p", "./D1/D2/D3", (char*)NULL); // 只有execlp执行失败才会走到这里 perror("execlp failed"); exit(EXIT_FAILURE); } else { // 父进程A:必须等待子进程B完成目录创建,否则会提前执行chdir报错 wait(NULL); // 切换到D3目录 if (chdir("./D1/D2/D3") == -1) { perror("chdir failed"); exit(EXIT_FAILURE); } // 获取并打印当前目录的绝对路径 char cwd[PATH_MAX]; if (getcwd(cwd, sizeof(cwd)) != NULL) { printf("D3目录的绝对路径:%s\n", cwd); } else { perror("getcwd failed"); exit(EXIT_FAILURE); } } return EXIT_SUCCESS; }
关键部分说明
- fork() 生成子进程:父进程执行fork后,会得到子进程的PID,子进程则返回0。我们通过这个返回值区分父子进程的任务——子进程负责调用mkdir创建目录,父进程负责后续的切换目录和打印路径。
- execlp 替换进程镜像:子进程里用
execlp调用系统的mkdir命令,-p参数是核心,它会自动创建所有不存在的父目录,不用手动逐层创建。注意参数列表必须以(char*)NULL结尾,这是exec系列函数的硬性要求。如果担心PATH环境变量的问题,也可以换成绝对路径写法:execl("/bin/mkdir", "mkdir", "-p", "./D1/D2/D3", (char*)NULL)。 - wait(NULL) 等待子进程完成:父进程必须等子进程把目录建好再执行chdir,不然子进程还没完成创建,父进程就去切换目录,会报"没有那个文件或目录"的错误。wait函数会让父进程阻塞,直到子进程结束。
- chdir 切换工作目录:这里用相对路径
./D1/D2/D3没问题,前提是你从当前目录启动程序。如果需要更严谨,也可以使用绝对路径。 - getcwd 获取绝对路径:
PATH_MAX是系统定义的最大路径长度,用getcwd把当前工作目录的绝对路径读到数组里,打印出来就完成需求了。
编译运行
用gcc编译:
gcc dir123.c -o dir123
运行程序:
./dir123
你就能看到D3目录的绝对路径被打印出来,同时当前目录下也会生成D1/D2/D3的多级目录。
如果遇到权限问题,确保你对当前目录有写入权限;如果execlp报错,检查系统里是否存在mkdir(一般都有),或者换成绝对路径的写法。
内容的提问来源于stack exchange,提问作者Pedro Quintans
相关产品推荐
相关产品推荐

