3. 进程
3.1 背景简介

3.2 进程的概念

3.3 虚拟CPU和虚拟内存
虚拟CPU

调度器和优先级

虚拟内存

进程地址空间


内核态和用户态

3.4 进程管理
内核管理进程信息


进程标识符PID

进程的用户ID和组ID(不懂-------------------------------)


passwd命令的设计原理



sudo的实现原理

文件特殊权限


粘滞位(Stickybit),或粘着位,是Unix文件系统权限的一个旗标。最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件。如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动其中的文件。实际应用中,粘滞位一般用于/tmp目录,以防止普通用户删除或移动其他用户的文件。
3.5 进程的状态

3.7 进程相关的命令

ps






top






优先级和nice值

kill命令和任务控制

crontab设置计划任务

3.8 使用系统调用创建进程
system函数


fork函数

fork的实现原理

fork的资源





- 加入斜杠

fork的写时复制

fork对打开文件的影响




exec函数族


3.9 进程控制
孤儿进程

僵尸进程

wait和waitpid


注意:返回值应设置为0-255之间,因为wait返回值的相关函数的原理


进程的终止
return只能再main函数中才能终止程序执行。



exit会清空缓冲区


守护进程
大致上来说,所谓守护进程(daemon),就是在默默运行在后台的进程,也称作“后台服务进程”,通常守护进程的命名会以d结尾。为了更准确地把握守护进程的概念,需要先了解一些其他的概念。
终端
终端是登录到Linux操作系统所需要的入口设备。终端可以是本地的,也可以是远程的。当操作系统启动的时候,init进程会创建子进程并使用 exec 来执行getty程序,从而打开终端设备或者等待远程登,然后再使用 exec 调用login程序验证用户名和密码。
进程组


- setpgid(0,0)将本自己设置组长,只有fork后的子进程才可以,因为父进程已经是组长了,组长不能修改组ID

会话
-
会话是通过终端控制的,一个会话最多只能连接一个终端。


-
由于组长不能更换进程组,所以不能调用setsid

-
一个会话中最多只有一个前台进程组。
-
终端断开,对应的会话中的进程终止
守护进程的创建流程****
脱离启动环境的进程。一般作为服务端。
所有的守护进程都是孤儿进程。

#include<54func.h>
void Daemon()
{
// 新建会话
if(fork())
{
exit(0); // 从这里可以看到守护进程一定是一个孤儿。
}
setsid();
// 关闭设备
for(int i =0;i<64;i++)
{
close(i);
}
// 修改环境属性
chdir("/");
umask(0);
}
int main()
{
Daemon();
for(int i =0;i<20;i++)
{
syslog(LOG_INFO,"I am daemon ,i = %d\n",i);
sleep(2);
}
return 0;
}
守护进程的日志

- 浏览器是一个多进程app。好处是一个崩了,宁外一个不回挂。
- nginx也是一个多进程服务器。
1044

被折叠的 条评论
为什么被折叠?



