程序和进程的区别
- 程序是编好的二进制文件,在磁盘上不占用内存,cpu等系统资源
进程是程序运行一次的过程,占用cpu和内存等系统资源 - 一个程序可以有多个进程,但是一个进程只属于一个程序
并发和并行的区别
并发是在一个cpu上利用时钟中断,模拟多个程序同时进行的效果
并行是有多个核,每个核上有不同的线程在运行,是真正的同时运行
fork函数
- 头文件
<sys/types.h>
<unistd.h> - 函数原型
pid_t fork()
返回值:
等于0:返回的是子进程
大于0:返回的是父进程的id
小于0:函数执行失败
注意:如果是想用for循环开多个进程,需要在子进程中break,不然子进程也会执行for中内容
父子进程区别
相同处:子进程会复制父进程的堆,栈,数据段,代码段,全局变量区,环境变量等(遵循读时共享,写时复制)
不同处:进程id,fork返回值,父进程id,进程运行时间,定时器,未决信号集
exec函数族
这里介绍俩个重点学的,所有的exec函数族都是调用execve的系统函数去完成调用(成功无返回,失败返回-1)
int execl("./fork",“fork”,NULL):第一个参数规定路径以及程序名,第一个参数调用的程序名,最后没有参数就以NULL结尾
int execlp(“ls”,“ls”,"-l",NULL):第一个参数因为是用的系统环境变量路径就不用在前面再加路径,直接写方法名,后面于第一个方法使用相同
孤儿进程
- 产生原因:父进程在子进程前结束,这是孤儿进程会交于系统的init进程管理,并回收相关的资源
- 解决办法:孤儿进程会交由系统进程管理,因此不会产生垃圾,但是为了防止init进程管理的孤儿进程数量过大可能会崩溃,因此可以最好还是调用wait管理
僵尸进程
- 产生原因:父进程在子进程终止时,没有回收相关资源,在程序结束时系统会回收程序堆栈等资源,但是在内核中的pcb还保留着,以及程序正常退出则保留着程序退出的状态,如果程序异常终止,则保留着导致进程终止的信号是哪个
- 处理方法:
杀死父进程,他会被交由init进程管理。
wait方法:阻塞父进程,并清理子进程在内核的存储,获取退出状态
waitpid:可以设置非阻塞回收
用进程退出时产生的SIGCHLD信号,对该信号进行处理回收内核资源