进程
一、进程创建
1.fork
fork()
//Linux创建子进程的系统调用,允许创建多个子进程,使用循环创建多个子进程;
//需要注意的是,创建出来的进程与父进程在调度是由调度器决定的,并没有严格的先后顺序;
二、进程终止
进程终止有三种情况,分别是:1.运行完成结果正确;2.运行完成结果错误;3.出现异常,程序终止;
进程终止之后会先处于僵尸态,等待父进程回收;即父进程可以知道子进程的终止信息;
2.1进程正常终止结果正常
对于程序正常退出时会返回退出码0;
echo $?
#可以查看最近一次进程退出的退出码;退出码可以使用return 数字返回,也可以使用exit(数字)返回;exit(n)是库函数,底层都会去调用系统调用_exit(n);
2.2程序正常终止结果错误
c语言根据不同的错误设置了错误码表,根据不同的错误码对比错误表来查找信息;进程的退出码其实指的就是错误码;父进程可以接收子进程终止信息;
2.3程序异常终止
当程序发生重大错误是就会异常终止,本质上就是子进程向父进程发送了信号。
三、进程等待
父进程会对僵尸进程进行等待,获取退出信息后,子进程才能被操作系统释放。
进程等待一方面是为了防止僵尸进程导致的内存泄漏,另一方面提供了一种方式可以直到子进程的运行情况;
wait(int status)
#等待任意子进程,status输出型参数,获取子进程退出状态。status的构成是低16位起作用,低七位标识终止信号,第八位为核心转储,次八位为退出码;查看退出码使用(status>>8)&0xFF,查看异常状态使用status&0x7F获取。也可以使用宏来接收,WIFEXITED表示是否异常,WEXITSTATUS表示退出码。如果不接收时传入空指针;
waitpid(pid_t id, int* status,int options)
#id=-1表示等待任意进程,具体其他id表示接收pid为id的进程,options表示父进程的等待方式,0表示默认阻塞等待,使用WNOHANG表示非阻塞等待;使用非阻塞轮询可以让父进程与子进程并发完成任务;
#对于返回值如果大于0则等待成功,=0,则还未就绪常在非阻塞轮询中使用,<0等待失败,即等待的不是id子进程
四、程序替换
使用exec*系列函数可以实现进程的程序替换,到注意的是程序替换后就不会执行原本的代码;
4.1程序替换原理
原理就是,哪一个进程执行了该函数就将哪一个进程的代码和数据完全替换,即将内存空间替换,不会创建新的进程,如果与其他进程指向同一个进程地址空间,就进行写时拷贝;
4.2exec*系列函数
一共有7个函数,如下是库函数,execve是系统调用;这些函数起到加载器的作用,将可执行程序载入到内存当中;
五、脚本语言编写
# #!(shebang)解释器
# 如下是解释器的相关指令,bash命令行解释器就是一个可执行程序,以.sh结尾