linux下的进程创建

时间:2021-09-06 17:34:02
1]Linux内核中的进程状态
 运行状态(TASK_RUNNING)
 可中断睡眠状态(TASK_INTERRUPTIBLE)
 不可中断睡眠状态(TASK_UNINTERRUPTIBLE)
 暂停状态(TASK_STOPPED)
 僵死状态(TASK_ZOMBIE)
2]写时复制copy on write===〉fork
 如果多个进程要读取它们自己的那部分资源的副本,那么复制是不必要的。
 每个进程只要保存一个指向这个资源的指针就可以了。
 如果一个进程要修改自己的那份资源的“副本”,那么就会复制那份资源。这 就是写时复制的含义
3]孤儿进程和僵尸进程
 如果父进程先退出,子进程还没退出那么子进程的父进程将变为init进程。(注:任何一个进程都必须有父进程)
 如果子进程先退出,父进程还没退出,那么子进程必须等到父进程捕获到了子进程的退出状态才真正结束,否则这个时候子进程就成为僵进程。
孤儿进程
如果父亲进程先结束,子进程会托孤给1号进程
4]
4fork和vfork
1)在fork还没实现copy on write之前。Unix设计者很关心fork之后立刻执行exec所造成的地址空间浪费,所以引入了vfork系统调用。
2)vfork有个限制,子进程必须立刻执行_exit或者exec函数。
即使fork实现了copy on write,效率也没有vfork高,但是我们不推荐使用vfork,因为几乎每一个vfork的实现,都或多或少存在一定的问题。
结论:
1fork子进程拷贝父进程的数据段
Vfork子进程与父进程共享数据段;
2fork父、子进程的执行次序不确定
Vfork:子进程先运行,父进程后运行;

Vfork和exec函数族在一起
execve替换进程映像(加载程序)注意execve是一个系统调用;
替换意味着:代码段、数据段、堆栈段、进程控制块PCB全部替换。

6]
进程终止的5种方式
 正常退出
 从main函数返回
 调用exit
 调用_exit
 异常退出
 调用abort产生SIGABOUT信号
 由信号终止ctrl+c SIGINT
7]
总结exit与_exit区别
1)_exit是一个系统调用,exit是一个c库函数
2exit会执行清楚I/O缓存
3exit会执行调用终止处理程序
8]
Wait和waitpid区别和联系
 在一个子进程终止前,wait 使其调用者阻塞,而waitpid 有一选择项,可使调用者不阻塞。
waitpid并不等待第一个终止的子进程—它有若干个选择项,可以控制它所等待的特定进程。
 实际上wait函数是waitpid函数的一个特例。
僵尸进程
 当一个子进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行或者父进程调用了wait才告终止。
进程表中代表子进程的数据项是不会立刻释放的,虽然不再活跃了,可子进程还停留在系统里,因为它的退出码还需要保存起来以备父进程中后续的wait调用使用。它将称为一个“僵进程”
如何避免僵尸进程
 调用wait或者waitpid函数查询子进程退出状态,此方法父进程会被挂起。
 如果不想让父进程挂起,可以在父进程中加入一条语句:signal(SIGCHLD,SIG_IGN);表示父进程忽略SIGCHLD信号,该信号是子进程退出的时候向父进程发送的。