在UNIX系统中,仅仅有一个系统调用能够用来创建新进程:fork。这个系统调用会创建一个与调用进程相同的副本。
在调用了fork之后。这两个进程(父进程和子进程)拥有相同的存储映像、相同的环境字符串和相同的打开文件。
这就是所有情形。同城,子进程接着运行execve或一个类似的系统调用,以改动其存储映像并运行一个新的程序。比如,当一个用户在shell中键入命令时,shell就创建一个子进程,然后,这个子进程运行sort。
之所以要安排两步建立进程,是为了在fork之后但在execve之前同意该子进程处理其文件描写叙述符,这样能够完毕对标准输入、标准输出和标准出错的重定向。
在windows中,情形正相反。一个Win32函数调用CreatProcess既处理进程的创建,也负责把正确的程序装入新的进程。
该调用有10个參数,期中包含要运行的程序、输入给该程序的命令行參数、各种安全属性、有关打开的文件是否继承的控制位、优先级信息、为该进程(若有的话)所须要创建的窗体规格以及指向一个结构的指针,在该结构中新创建进程的信息被返回给调用者。
除了CreateProcess。Win32中有大约100个其它的函数用于处理进程的管理、同步以及相关的事物。
在Unix和Windows中。进程创建之后,父进程和子进程有各自不同的地址空间。
假设当中某个进程在其地址空间中改动了一个字,这个改动对其它进程而言是不可见的。
在UNIX中,子进程的初始地址是父进程的一个副本,可是这里涉及两个不同的地址空间,不可写的内存去是共享的(某些UNIX的实现使程序征文在两者间共享,由于它不能被改动)。可是。对于一个新创建的进程而言,确实有可能共享其创建者的其它资源。诸如打开的文件等。在Windows中,从一開始父进程的地址空间和子进程的地址空间就是不同的。
在UNIX中,进程和它的全部子女以及后裔project组成一个进程组。
相反,Windows中没有进程层次的概念,全部的进程都是地位同样的。唯一类似于进程层次的暗示是在创建进程的时候。父进程得到一个特别的令牌(成为句柄handle),该句柄能够用来控制子进程。可是,它有权把这个令牌传给某个其它进程。这样就不存在进程层次了。在UNIX中,进程就不能剥夺其子女的“继承权”。