fork()太奇葩了
《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()); }