文档介绍:零基础学习fork()函数 一个进程,包括代码、数据和分配给进程的资源。fork的原意是:分裂。fork()函数通过系统调用创建(分裂)一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。   一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。下面通过例子由浅入深学习fork(函数:例一程序代码:intmain({pid_tpid;语句a;pid=fork(;语句b;}代码分析:(=fork(时,这个进程马上分裂(fork的中文意思成两个进程,我们称为父进程和子进程(:fork函数被调用一次,但返回两次,两次返回的唯一区别是子进程的返回值是0,而父进程的返回值则是子进程的进程ID。(也可以理解为::fork函数被调用一次,但执行两次,父进程执行一次返回子进程的进程ID,子进程执行一次返回0) 子进程和父进程都执行在fork函数调用之后的代码即语句b,子进程是父进程的一个拷贝。例如,父进程的数据空间、堆栈空间都会给子进程一个拷贝,而不是共享这些内存。例二程序代码及注释:#include  //C和C++程序设计语言中提供对POSIX操作系统API的访问功能的头文件的名称 #include  //  在使用标准函数库中的输入输出函数时,编译系统要求程序提供有关的信息#include//这个头文件不能少,否则pid_t没有定义int main (   {    pid_t fpid; //fpid表示fork函数返回的值 //pid_t其实是一个typedef,也就是类型定义,真正的原型是unsignedint……    int count=0; //此时,只有一个进程在执行这段代码   fpid=fork(;   //此时,有两个进程在执行这段代码     if (fpid < 0   //如果出现错误,fork返回一个负值;      printf("error in fork!";   else if (fpid == 0 //在子进程中,fork返回0;{          printf("i am the child process, my process id is %d\n",getpid(; //getpid(函数功能:取得进程识别码          printf("iamthechildofmyparent\n";         count++;    }     else //在父进程中,fork返回新创建子进程的进程ID。所以fpid=新建进程的ID{          printf("i am the parent process, my process id is %d\n",getppid(;   //还有一个记录父进程pid的变量,可以通过getppid()函数获得变量的值。        printf("iamthefatherofchild\n";          count++;     }      printf("统计结果是: %d/n",count;      return 0;  }    运行结果是:   iamthechildprocess,myprocessidis5574   我是爹的儿子   统计结果是:1   iamtheparentprocess,myprocessidis5573   我是孩子他爹代码分析:前面为了好入门仅仅介绍根据fork(函数的返回值判断子进程还是父进程。在此,正式说明fork()函数一共有三种返回值:a)在父进程中,fork返回新创建子进程的进程ID;   b)在子进程中,fork返回0;   c)如果出现错误,fork返回一个负值;在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。至于fpid的值为什么在父子进程中不同。“其实就相当于链表,进程形成了链表,父进程的fpid(p意味point指向子进程的进程id,因为子进程没有子进程,,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。两个进程的内容完全一样,打印的结果不一样那是因为判断条件的原因,上面列举的只是进程的代码和指令,还有变量哦。在fork函数执行完毕后,如果创建新进程不成功fork出错可能有