#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t pid;
printf("Before fork()\n");
printf("%d\n", getpid());
pid = fork(); // 调用 fork()
printf("After fork()\n");
if (pid < 0) {
// fork() 失败
perror("fork failed");
exit(1);
} else if (pid == 0) {
// 子进程
printf("In child process:\n");
printf("fork() returned: %d (always 0 in child)\n", pid);
printf("Child process ID: %d\n", getpid());
printf("Parent process ID: %d\n", getppid());
} else { //pid > 0
// 父进程
printf("In parent process:\n");
printf("fork() returned: %d (child's PID)\n", pid);
printf("Parent process ID: %d\n", getpid());
}
return 0;
}
Before fork()
8088
After fork()
In parent process:
fork() returned: 8089 (child's PID)
Parent process ID: 8088
After fork()
In child process:
fork() returned: 0 (always 0 in child)
Child process ID: 8089
Parent process ID: 1255
输出顺序
输出顺序(父进程还是子进程先输出)取决于调度器。
fork() 的行为
调用 fork() 后,系统会复制当前的进程,从而产生两个几乎完全相同的进程:
- 父进程继续运行,并且
fork()返回子进程的 PID(在这里是7802)。 - 子进程从
fork()调用处开始运行,但fork()返回0。
因此,父子进程从 fork() 的下一行开始分别执行。
为什么子进程的父进程 ID 是 1255?
这表明:
- 父进程(PID
7801)在fork()调用后已经退出,所以子进程的父进程变成了系统的**init进程(PID 1255) . init是 Linux 系统中负责管理孤儿进程的守护进程。