一、进程的概念
进程:(进行中的程序)--正在运行的程序 (动态的) ---内存
程序的一次执行过程
进程是程序的一个实例
进程是跑起来的程序,一个程序可以对应多个进程。
程序----静态---硬盘 进程---动态---内存
操作系统为了管理程序的动态运行过程----进程
程序 = 代码(代码区) + 数据(栈区,堆区,字符串常量区,静态区)
进程 = PCB(进程控制块) + 进程实体(text | data | bss | 堆区 | 栈区)
二、进程的状态
ps -elf | grep 程序名 主要查看父子进程,包含pid,ppid
查看a.out进程
ps aux | grep 程序名 查看某个进程的pid号及状态信息。
pstree -sp pid号 查看父子进程间的关系。
kill 给进程发信号
kill -l 查看kill可以发送的信号,kill -9 pid号 给指定的pid号发送9信号。
常用的信号:-9:结束,-19:暂停,-18:继续。
killall 可以指定进程名称这种方式发送信号,例如:killall -9 a.out结束所有的a.out
三态模型-----操作系统理论(运行、就绪、阻塞)
linux系统下(七种)
man ps
R------运行或可运行(就绪态)
S------可中断的睡眠态
D------不可中断的睡眠态
T------暂停态
Z------僵尸态
三、进程的编程
为了实现多任务
四部分:创建进程、进程的执行、进程结束、进程结束时的资源回收---僵尸态。
进程的创建:pid_t fork(void)
功能:创建一个子进程,通过复制调用进程复制的子进程。
成功:在父进程中返回子进程的pid号,在子进程中返回0。
失败:返回-1,并且子进程没有被创建。
pid号:非负整数,最小为1。
fork成功后,从下一句开始执行。
调用一次函数,在父进程和子进程分别返回了一个值。
32位平台:1.每个进程拥有独立的4G内存空间(虚拟的)
2.每个进程运行在各自独立的4G内存空间中
3.父子进程间,内存相互独立,不受影响。
4.父子进程运行的顺序不确定,取决于操作系统--先调度谁。
结束子进程,父进程未收尸--僵尸态
结束父进程,子进程还在,被操作系统收养,此时子进程在后台运行。
有x个fork(),就有个进程,创建了-1个进程。
例如:存在两个fork,则有四个进程,创建了3个进程,树状图如下:
练习: fork()&&fork()||fork(); //总共几个进程?
getpid: pid_t getpid(void); //pid_t
功能:获得调用该函数进程的pid
返回值: 进程的pid
getppid:pid_t getppid(void);
功能:获得调用该函数进程的父进程pid号
返回值:返回父进程id号