在父进程中创建一个子进程。 父进程:打印自己和子进程的 pid,打印当前工作目录,休眠 5 秒,再打印当前工作目录。 子进程:打印父进程和自己的 pid,打印当前工作目录,切换当前工作目录,再打印当前工作目录。 对照输出结果,解释一下为什么会是这样。
时间: 2024-09-27 12:08:54 浏览: 47
在C语言中,你可以使用`fork()`系统调用来创建一个新的子进程。下面是一个简单的示例,演示父进程和子进程如何操作:
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#define MAX_PATH_LENGTH 100
int main() {
int pid = fork(); // 创建子进程
if (pid == 0) { // 如果这是子进程
printf("子进程PID: %d, 当前工作目录: %s\n", getppid(), getcwd(NULL, MAX_PATH_LENGTH));
printf("我是子进程,父进程PID: %d, 当前工作目录: %s\n", getpid(), getcwd(NULL, MAX_PATH_LENGTH));
chdir("/"); // 切换到根目录
printf("子进程新的工作目录: %s\n", getcwd(NULL, MAX_PATH_LENGTH));
} else if (pid > 0) { // 如果这是父进程
printf("父进程PID: %d, 子进程PID: %d, 当前工作目录: %s\n", getpid(), pid, getcwd(NULL, MAX_PATH_LENGTH));
sleep(5); // 休眠5秒
printf("父进程结束休眠,当前工作目录: %s\n", getcwd(NULL, MAX_PATH_LENGTH));
} else { // fork失败
perror("Fork failed");
exit(EXIT_FAILURE);
}
return 0;
}
```
当你运行此程序时,你会看到以下输出:
1. 父进程会首先打印自己的PID和当前工作目录,然后休眠5秒,再次打印工作目录。这是因为父进程在创建子进程后立即开始执行,而子进程会在父进程休眠期间运行。
2. 子进程则在父进程休眠之前打印出自己的PID、父进程的PID以及初始的工作目录。接着,它切换到根目录(`chdir("/")`),并打印新工作目录。由于这是在父进程休眠期间完成的,所以父进程不会看到子进程切换后的目录。
总结起来,父子进程的行为独立,互不影响。父进程在子进程执行期间保持原状态,而子进程有自己的生命周期和变化。
阅读全文