1、进程会创建新的地址空间:
子进程是父进程的复制品,在fork之后子进程获得父进程的数据空间、堆和栈的复制品,这就是子进程所拥有的拷贝。(线程使用当前的地址空间)
2、进程结束的五种原因:
正常终止:
1>从主函数main返回
2>调用exit
3>调用_exit
异常终止:
1>调用abort
2>由一个信号终止
不管进程如何终止,最后都会执行内核中的同一段代码。这段代码为相应的进程关闭所有打开描述符,释放它所使用的存储器等等。
3、exit和_exit函数
_exit立即进入内核,exit则先执行一些清除处理(包括调用执行各终止处理程序,关闭所有标准I/O流等),然后进入内核。
4、由fork创建的新进程被称为子进程,被调用该函数一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值是新子进程的进程ID。将子进程ID返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以获得其所有子进程的进程ID。fork使子进程得到的返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid以获得其父进程的进程ID(进程ID0总是由交换进程使用,所以一个子进程的进程ID不可能为0)。
5、fork之后是父进程先执行还是子进程先执行是不确定的,这取决于内核所使用的调度算法,如果要求父、子进程之间相互同步,则要求某种形式的进程间通信。
6、fork的两种用法:
1)一个父进程希望复制自己,使父、子进程同时执行不同的代码段。例如:父进程等待服务请求,当请求到达时,父进程调用fork,使子进程处理此请求。父进程则继续等待下一个服务请求。
2)一个进程要执行一个不同的程序。子进程在从fork返回后立即调用exec。
7、在说明fork函数时,一定是一个父进程生成一个子进程。子进程将其终止的状态返回给父进程。但是如果父进程在子进程之前终止,则将如何呢?
8、对于其父进程已经终止的所有进程,它们的父进程都改变为init进程。我们称这些进程由init进程领养。保证每一个进程都有一个父进程。
9、一个已经终止、但是其父进程尚未对其进行善后处理(获取终止进程的有关信息、释放它仍占用的资源)的进程被称为将死进程。被init领养的进程不会变成僵死进程,init会自动调用。
10、exec函数族:exec函数族可以根据指定的文件名或目录找到可执行文件,启动另一个执行程序,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了。可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。
11、exec函数族使用的场合:
1)当进程认为自己不能再为系统和用户做出任何贡献时就可以调用exec函数时,执行新的程序
2)如果某个进程想同时执行另一个程序,可以调用fork函数创建子进程,然后在子进程中调用任何一个exec函数。