linux下fork的使用一

来源:互联网 发布:值乎下载 编辑:程序博客网 时间:2024/04/20 22:41

头文件:

 #include <unistd.h>

 函数定义:

 int fork( void );
 返回值:

  子进程中返回0,父进程中返回子进程ID,出错返回-1

 函数说明:

一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。


 示例代码:
#include <unistd.h>#include <stdio.h> int main(int argc, char ** argv ) {        int pid = fork();        if(pid == -1) {                // print("error!");        } else if(pid == 0) {                // print("This is the child process!");        } else {                // print("This is the parent process! child process id = %d", pid);        }        return 0;}

Error Codes

fork()系统在Linux中的返回值是没有NULL的.

出错返回错误信息如下:EAGAIN

达到进程数上限.ENOMEM没有足够空间给一个新进程分配。


附:

操作系统对进程的管理,是通过进程表完成的。进程表中的每一个表项,记录的是当前操作系统中一个进程的信息,进程在系统的唯一标识是PID,PID是一个从1到32768的正整数,其中1一般是特殊进程init,其它进程从2开始依次编号,当用完32768后,从2重新开始。

一个称为“程序计数器(program counter, pc)的寄存器,指出当前占用 CPU的进程要执行的下一条指令的位置。

当分给某个进程的 CPU时间已经用完,操作系统将该进程相关的寄存器的值,保存到该进程在进程表中对应的表项里面;把将要接替这个进程占用 CPU的那个进程的上下文,从进程表中读出,并更新相应的寄存器(这个过程称为“上下文交换(process context switch)”,实际的上下文交换需要涉及到更多的数据,那和fork无关,不再多说,主要要记住程序寄存器pc指出程序当前已经执行到哪里,是进程上下文的重要内容,换出 CPU的进程要保存这个寄存器的值,换入CPU的进程,也要根据进程表中保存的本进程执行上下文信息,更新这个寄存器)。