概念相关
了解进程,程序,和并发
单道程序设计模式 排队执行 DOS
多道程序设计模式 时间片… 时钟中断机制(硬件机制)宏观并行,微观串行
CPU和mmu
mmu作用:将虚拟地址对应到物理地址上,程序员只需要虚拟地址。
进程控制块PCB(进程描述符)
在linux内核中以结构体的形式存在:
1.进程id,pid_t
2.进程的状态(就绪态,挂起态,运行态,结束态,初始化)
3.进程切换时需要保存的寄存器信息
4.描述虚拟地址空间的信息
5.描述控制终端的信息
6.当前的工作目录
7.umask掩码
8.文件描述符表
9.和信号相关的信息
10.uid和gid
11.会话和进程组
12.进程可用的资源上限
环境变量
用户配置的适合自己的环境的参数
查看环境变量表
getenv函数 获得环境变量
setenv函数 改变或者添加环境变量
进程控制
fork函数:创建一个子进程
返回值有两个,子进程id(父进程返回)和0(子进程返回);
for循环不能循环创建子进程
创建了2的n次方-1个进程
解决方法:`
if(pid == 0) break;
在确认是子进程时就直接跳出循环。
getuid 获得当前进程实际用户id
geteuid 获取当前有效用户id
getgid 获取当前进程使用组id
getegid 获取当前进程有效用户组
进程共享
父子相同处(相同不代表一样,只是都有这些属性):全局变量,代码段,栈,堆,环境变量,用户id,宿主目录,进程工作目录,信号处理方式
父子不同处:进程id,fork返回值,进程运行时间,闹钟,未决信号集
父子共享文件描述符和mmap建立的映射区。
读时共享,写时复制原则
exec函数族
将进程原有的0-4g空间替换成一个新的你赋予的需要执行的程序的0-4g空间。但进程id不改变。
execlp函数:l为list,p为path
execlp(执行的程序名,arg【0】,arg【1】…,NULL);
第二个参数理解,比较重要
execl函数
execl(路径,程序名);
execl("/bin/ls","ls","-l",NULL);
优点:可以执行自己写的程序
exec函数族一般没有返回值,错误才会产生返回值,一旦调用成功就执行新的程序,不返回。
回收子进程
孤儿进程
没有父进程回收的子进程,init进程会进行回收。
僵尸进程
子进程终止,父进程未回收,pcb残留在内核,变成僵尸进程。kill不能清除僵尸进程。
wait函数
1.阻塞等待子进程退出
2.回收子进程残留资源
3.子进程结束状态(退出原因)
pid_t = pid;
pid = wait(int *status);
int *status
用宏来表示
int status;
pid_t pid;
//子进程中写
return status的值;
//父进程中写
pid = wait(&status);
if(WIFEXITD(status)){
cout << "child exit with" << WEXITSTATUS(status) <<endl;
}
一次wait只回收一个子进程
循环回收
while(wait(NULL));
waitpid函数
pid_t waitpid(pid_t pid,int *status,int options);//0值与阻塞一样,WNOHANG不阻塞
//第一个参数是需要回收的进程的id,第二参数与wait的参数相同,第三个可以不阻塞父进程
如父进程不阻塞,采用轮寻的方式才能保证子进程被回收。
do{
wpid = waitpid (-1,NULL,WNOHANG);//if wipd == 0 说明子进程正在运行
if(wpid > 0) n--;//n为子进程的总个数,就--
sleep(1);
}while(n>0);