日期:2014-05-16  浏览次数:20586 次

linux——fork(进程)


 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)的子进程。