进程管理
僵尸进程:
每个进程结束以后会释放所占用的资源,但是还是会保留少许的状态资源以供其父进程查看子进程曾经运行时候状态。
一旦父进程通过wait()或者waitpid()检查了子进程曾经运行的状态,内核就会释放子进程占用的资源。
如果子进程已经结束运行,但是父进程还在运行。则这个时候子进程就会变为僵尸进程。
如果父进程没有等待查看子进程状态,然后结束运行。子进程的父进程就会被设置为init进程,init进程会查看其子进程如果有僵尸进程则会释放。
或者父进程比子进程更早结束,也是如此。
进程的实际用户ID:
实际运行进程的用户ID。
进程的有效用户ID:
当前进程所使用的的用户ID,权限认证用的是这个ID。程序运行过程中可以通过setuid()改变这个有效用户ID。
进程、进程组、会话组:
进程、进程组、会话组之间的构成。
用户登录系统以后进程、进程组、会话组的构成:
守护进程:
成为守护进程的两个前提条件:
1.必须是init进程的子进程;
2.不与任何终端相关联;
如何创建守护进程:
1.进程fork()一个子进程:目的是为了确保不是进程组或者会话组的首进程。
2.将父进程exit()退出:使得子进程由init进程接管。
3.进程调用setsid()创建新的会话组和进程组。守护进程的pid为会话组id和进程组id。
4.关闭所有文件描述符。
5.改变进程的工作目录为根目录,将文件描述符0、1、2重定向到:/dev/null。
内存对齐:
在结构体中有两个原则:
1.每个变量自身对齐(变量大小是地址的整数倍),如果没对齐要对前一个变量进行字节填充。
2.最后一个变量是否填充是以结构体中最大变量类型大小进行对齐填充的。