面试题答案
一键面试fork函数的作用
fork函数用于创建一个新进程,称为子进程。它将当前进程(父进程)复制一份,子进程几乎与父进程完全相同,包括代码段、数据段、堆、栈等。子进程和父进程都从fork函数调用处继续执行,但它们拥有独立的地址空间。
父子进程的执行顺序
在fork函数调用成功后,父子进程的执行顺序是不确定的。这取决于操作系统的调度算法。操作系统会根据自身的调度策略,在适当的时候分别调度父进程和子进程执行,它们可能交替执行,也可能某一个进程先执行一段时间后另一个进程才得到执行机会。
区分父子进程
fork函数调用成功后,会返回两个值:
- 在父进程中,fork函数返回子进程的进程ID(PID)。因为父进程可能有多个子进程,通过返回的子进程PID可以对不同子进程进行管理。
- 在子进程中,fork函数返回0。所以通过判断fork函数的返回值,就可以区分父子进程。例如:
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid;
pid = fork();
if (pid > 0) {
// 父进程代码
printf("I am parent process, my pid is %d, child pid is %d\n", getpid(), pid);
} else if (pid == 0) {
// 子进程代码
printf("I am child process, my pid is %d\n", getpid());
} else {
// fork失败
perror("fork");
}
return 0;
}
在上述代码中,通过判断pid
的值来确定是父进程还是子进程在执行相应的代码块。