linux进程相关

概念相关

了解进程,程序,和并发

单道程序设计模式 排队执行 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);

在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值