9.进程


进程和程序的区别:程序是一段静态的代码,是保存在非易失性存储器上的指令和数据的有序集合,没有任何执行的概念;而进程是一动态的概念,它是程序的一次执行过程,包括动态创建、调度、执行、消亡的整个过程,它是程序执行和资源管理的最小单位。
进程分类:
交互进程:可以是前台也可以是后台,最大生命周期为从执行开始到终端关闭(前台进程:既可以输入也可以输出;后台进程:不可以输入)
批处理进程:不与用户打交道,常在后台运行。
守护进程:一定是后台进程(后台进程不一定是守护进程),最大生命周期为从执行开始到系统关闭
进程的系统数据段:
task_struct (PCB) 用来描述进程信息
PC 程序计数器   用来存放下一条指令的地址

进程的用户数据段、正文段:
一个可执行程序:代码区(正文段,只读、共享) 数据区(已初始化、未初始化数据区) 堆区 栈区
进程状态:
R:运行态
S:可中断睡眠态    (注意:睡眠、等待、阻塞)
T:停止态    一定是后台进程   最好使用 kill -9 杀死停止态进程
Z:僵尸态    一定要避免产生(子进程退出,父进程没有给子进程收尸)
孤儿进程:父进程退出,子进程会被init收养变成孤儿进程(合法操作)     特点:由前台变成后台

+ 前台进程
< 高优先级
N 低优先级
优先级:[-20,19] 从高到低
[-20,-1] 系统进程优先级
[0,19]  用户进程优先级
  
nice -优先级编号 可执行程序
renice 优先级编号  进程号
s 会话组长:会话包含若干个具有不同功能的进程组,进程组包含了若干个相同功能的进程
进程状态切换:
kill -19 进程号   使一个运行态或者可中断睡眠态的进程暂停
kill -18 进程号   使一个暂停的进程继续运行,但是是后台的
kill 进程号   默认杀死一个进程(默认使用的信号为15)
ps命令:
pstree   查看进程树
ps -ef   主要查看进程
ps -aux  查看进程状态
ps -axj  同时查看进程状态和父子进程号
进程编程相关函数:
1)pid_t fork(void):用于从已存在的进程中创建一个新进程,而原进程称为父进程    返回值   0表示是子进程;大于0表示是父进程;等于-1表示出错(注意:子进程没有执行fork()函数,而是从fork函数调用的下一条语句开始执行)
2)int execl(const char *path,const char *arg......):在一个进程中执行另一个程序,它可以根据指定的文件名或目录名找到可执行文件,并用它来取代当前进程的数据段、代码段和堆栈段。这里的可执行文件可以是二进制文件或脚本文件,注意目录必须以”/“开头
3)exit函数和_exit函数:两者都可以退出进程,内部的参数都可以使用EXIT_SUCCESS  EXIT_FAILURE,但是exit退出进程时要刷新缓存区、_exit退出进程不刷新缓存区
4)pid_t wait(int *status):如果子进程不退出,wait会阻塞,当子进程退出时wait唤醒,并且回收子进程资源
5)pid_t waitpid(pid_t pid,int *status,int options):当pid>0,回收进行ID等于pid的子进程;当pid=-1,回收任何一个子进程,此时和wait作用一样
创建守护进程:
1.创建孤儿进程      2.setsid创建新会话       3.chdir设置工作目录     4.umask(0)重设文件掩码       5.getdtablesize()获取已打开的文件描述符         6 .close()关闭文件描述符


作业:1、使用fork创建一个子进程
     2、父进程复制1.txt文件的前面一半
     3、子进程复制1.txt文件的后面一半
len = lseek(fd,0,SEEK_END);

猜你喜欢

转载自blog.csdn.net/qq_33575901/article/details/80958361