嵌入式linux的学习笔记-fork的理解(一)

环境,虚拟机 VirtualBox, 系统Ubuntu9.0.4 编译环境gcc 4.4.0

今天看到一个比较常用的函数 fork,用于创造子进程,首先接触到下面的这个函数

#include <unistd.h>;
#include <sys/types.h>;
main ()
{
pid_t pid;
pid=fork();
if (pid < 0)
printf("error in fork!");
else if (pid == 0)
printf("i am the child process, my process id is %dn",getpid());
else
printf("i am the parent process, my process id is %dn",getpid());
return 0;

}
结果是
[root@localhost c]# ./a.out
i am the child process, my process id is 4286
i am the parent process, my process id is 4285

运行前猜想:当这个进程在第一次调用时fork创建新进程,在新的子进程中,它是否会调用fork函数再创建新的子进程吗?通过结果显示,答案是否 定的,他只会通过fork判断目前是否为子进程,而不会再次创建子进程的子进程.作为子进程他会是pid=0,并且跳转到pid=fork(); 后继续执行

其实,在子进程刚刚被创建的时候,pid的数值并不是0,而是从父进程继承来的子进程ID,只是在 pid=fork()执行后才被赋值为0;

因此,这样就可以理解linux在刚刚建立时,只有一个init进程,而剩余的所有进程都是他的子进程或者子进程的子进程了,下面有个例子很有说明性

//主进程为A
pid_t pid;

if((pid = fork()) < 0) //创建子进程B,则B为A的子进程
{
//如果子进程创建失败,输出error
}
else if(pid == 0) //如果创建成功,并且当前程序运行在进程B中,因为我们通过pid==0进行了过滤
{
if((pid = fork()) < 0) //再一次在子进程中创建了子进程C,则C为B的子进程,是A的孙子进程
// 如果子进程创建失败,输出error
if(pid == 0) //自我检测是否处于C进程中
{
// C进程
printf("secondary child.\n");
exit(0);
}

    // B进程
printf("first child.\n");
exit(0);
}

// fathter
printf("father.\n");
exit(0);

使用这个方法,就可以创建子进程的子进程了,关键是要明白fork()一个进程后,这个子进程是从哪开始执行,到哪会结束

其实,通过fork的字面理解就很容易解释这个问题了,它的翻译为"分叉",也就是说,在fork之前的程序只会被运行一次,而从fork之后,程序会分开执行.

posted @ 2010-12-17 12:04  flyxiang  阅读(474)  评论(0编辑  收藏  举报