pcb就是task_struct 由slab算法分配在内核内存 1kb 在 0-1GB的内核空间里,所有进程共享同一个内核空间0-1GB因为 进程运行在用户态不会修改内核空间。
内核空间 环境变量等信息 栈 堆 (多个线程栈会夹在堆中) 未初始化变量段,初始化变量段,代码段。
ipcs 是一个UINX/Linux 的命令,用于报告系统的消息队列、信号量、共享内存等
父进程死后,子进程变为孤儿进程,被init进程托养,父pid改为1
子进程死后,1-4GB的空间会清掉,但在0-1GB的内核空间的pcb信息还不会清掉,这个时候称为僵尸进程,需要当父进程调用wait()或者waitpid()系统调用取得子进程的终止状态。才会清掉那pcb信息
如果父进程也死了那就被init进程托养,init进程会周期执行wait清掉僵尸进程
1 ) exit 和return 的区别。
① exit 是一个函数,带有参数, exit 执行完后把控制权交给系统;
② re 阳m 是函数执行完后的返回, re阳m 执行完后把控制权交给调用函数。
2) exit 和abort 的区别。
① exit 是正常终止进程;
② abort 是异常终止。
( 3 )现在我们重点了解exit()和_exit()函数。
1 ) exit 和exit 函数都是用来终止进程的。
当程序执行到exit 或_exit 时,系统无条件地停止剩下所有操作,清除包括PCB 在内的各种数据结构,并终止本进程的运行。
2) exit() 是在头文件stdlib.h 中声明,而_exit()声明在头文件unistd.h 中声明。exit 中的参数exit code 为0 时,代表进程正常终止,若为其他值,表示程序执行过程中有错误发生。并且_exit()执行后立即返回给内核,而exit() 要先执行一些清除操作,然后将控制权交给内核。在调用exit 函数时,其会关闭进程所有的文件描述符,清理内存以及其他一些内核清理函数,但不会刷新流( stdin 、stdout 、stderr· · · )的数据。exit 函数是在exit 函数之上的一个封装, 其会自动调用exit ,并在调用之前先刷新流数据。
3) exit()函数与一exit()函数最大区别就在于exit()函数在调用exit 系统之前要检查文件的打开情况,把文件缓冲区的内容写回文件。由于Linux 的标准函数库中,有一种被称作“缓冲I/。”的操作, 。其特征就是对应每一个打开的文件,在内存中都有一片缓冲区。每次读文件时, 会连续的读出若干条记录,这样在下次读文件时就可以直接从内存的缓冲区中读取;同样,每次写文件的时候也仅仅是写入内存的缓冲区,等满足了一定的条件(如达到了一定数量或遇到特定字符等)后,再将缓冲区中的内容一次性写人文件。这种技术大大增加了文件读写的速度,但也给编程带来了一点儿麻烦。比如有一些数据,理论上应该已经写入了文件,但实际上因为没有满足特定的条件,它们还只是保存在缓冲区内,这时如果用exit()函数直接将进程关闭, 缓冲区的数据就会丢失。因此,要想保证数据的完整性,就一定要使用exit()函数。
wait()函数会阻塞,直到直到有信号来到或子进程结束
原文:https://www.cnblogs.com/l2017/p/10623768.html