《UNIX环境高级编程》说: “fork()调用一次,返回两次”。 这什么玩意儿? 作为Java程序员觉得很难理解。虽然书上提到了进程复制,但当时还是转不过弯来。这本书的例子代码里会判断fork()返回值的不同而分别执行父子进程的行为,搞得我更晕了,难道linux父子进程实际上是同一个进程?
后来看了一下《操作系统设计与实现》,才终于明白。 下面用代码解释一下。
/*
fork()复制出的子进程跟当前进程所基于的代码一模一样,所以子进程也会执行下面的代码。不过,它不是从第一句开始执行的。
*/
int main(){
/*下面这句只会执行一次,即只被父进程执行*/
printf("开始执行。当前进程的ID=%d\n", getpid());
int pid = fork();
/*这句会打印两次,说明子进程从这里开始执行*/
printf("调用fork()之后。当前进程的ID=%d\n", getpid());
/*下面两次打印出来的pid并不相同*/
if(pid > 0){
printf("fork()返回%d.当前进程是父进程,进程ID=%d\n", pid, getpid());
}
if(pid == 0){
printf("fork()返回%d.当前进程是子进程,进程ID=%d\n", pid, getpid());
}
/*下面这句会打印两次,父子进程都会执行*/
printf("程序准备退出。当前进程的ID=%d\n================\n", getpid());
}