进程的认识
pid_t fork(void);如果是子进程则返回0,为父进程返回子进程ID,出错返回-1.
子进程除了共享正文段之外,其数据空间,堆,栈都是父进程的副本。
fork失败的2个主要原因是:系统中进程太多,或者该实际用户ID的进程超过了系统限制。
fork的用法:1.一个父进程希望复制自己,使父,子进程同时执行不同的代码段。如父进程等待客户端请求,请求到时,fork子进程来处理请求。父进程继续等待下一个请求。
2.一个进程要执行一个不同的程序。在这种情况下,子进程从fork返回后立即调用exec.
vfork与fork的返回值一样,但两者很大不同:
首先子进程在父进程地址空间中进行,知道调用exec或者eixt退出,还有就是保证子进程先运行,不需要sleep帮助。
附注:理解exit和_exit的区别。exit关闭I/O流,和各种终止程序,而_eixt直接进入内核。
正常情况下子进程会将自己的终止状态传递给父进程。但是如果父进程先终止,那么其所以的子进程的父进程为init进程(ID=1)。
所以init进程的子进程要么是自己产生的,也可以使收养别的的。
僵死进程:内核为每个子进程保存了一定量的信息,当终止进程的父进程调用wait或者waitpid时,可以得到这些信息。由于这些信息占用一定的空间,父进程尚未获取时被称为僵死进程。
init的子进程不会有僵死进程,这和其设计有关,就是只要有子进程终止,init立马调用wait获取其终止状态。
wait和waitpid用来获取子进程的终止状态,但是waitpid可以设为非阻塞,并且可以设定某一个子进程或者某一个范围的子进程。
fork()>0说明在父进程中运行,但是其pid是子进程的,这样我们在父进程中调用waitid(pid,NUILL,0)时可以发现有一定的道理。
浙公网安备 33010602011771号