日期:2014-05-16 浏览次数:20642 次
1 #include <unistd.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 int
6 main(void)
7 {
8 int i = 0;
9 pid_t fpid;
10 printf("i\tson/pa\tppid\tpid\tfpid\n");
11
12 for(i = 0; i < 2; i++) {
13 fpid = fork();
14 if(fpid == 0)
15 printf("%d\tchild\t%4d\t%4d\t%4d\n", i, getppid(), getpid(), fpid);
16 else
17 printf("%d\tparent\t%4d\t%4d\t%4d\n", i, getppid(), getpid(), fpid);
18 }
19 return 0;
20 }
fork函数用于创建一个子进程,fork函数被调用一次,返回两次,其中子进程返回值为0,父进程返回值为子进程的进程ID。子进程和父进程会继续执行fork之后的指令,子进程获得父进程数据空间,堆和栈的副本,但是共享正文段。
在此例中,自动变量i存储在栈中,for循环时,子进程获得i的副本,判断i是否小于2,程序运行结果如下:
1 zzq@ubuntu:~/program/fork$ ./a.out
2 i son/pa ppid pid fpid
3 0 parent 3602 3779 3780
4 0 child 3779 3780 0
5 1 parent 3602 3779 3781
6 1 parent 3779 3780 3782
7 1 child 1 3782 0
8 1 child 1 3781 0
9 zzq@ubuntu:~/program/fork$ echo $$
10 3602
显示,当前进程ID为3602(表示为p3602),对于子进程p3782 和p3781,由于此时父进程优先执行,return(当然我们并不能事先假设子父进程执行先后顺序,这取决于内核所采用的调度策略),子进程成为init进程(进程ID为1)的子进程。