进程退出:
wait //阻塞方式---调用进程 一般不做额外的事情
waitpid //非阻塞方式---调用进程 逻辑一般不受影响(必须套在循环中)
wait
1、获取子进程退出状态
2、回收资源(会让僵尸态的子进程销毁)
整型指针:被调修改主调
注:
1、wait的本身是一个阻塞操作会使调用者阻塞
2、父进程要获得子进程的退出状态
子进程:
exit(退出状态)
退出状态值 只有最低8位有效(0-255)
父进程:
wait(&status)
获取到退出状态值
WIFEXITED() //先判断是否为正常退出
WEXITSTATUS() //获取到exit传递的退出状态值
WIFSIGNALED()//异常退出
WTERMISIG()//
waitpid
等待子进程状态发生变化
参数:
pid
pid = -1 // 表示等待所有子进程状态改变
pid > 0 //表式等待 指定的子进程状态改变
wststus //表示获取到的子进程的状态信息
options //选项 可以不阻塞(WNOHANG // hang on) 默认是阻塞(0)
非阻塞调用:
非阻塞和阻塞
1、阻塞 会影响父进程处理逻辑
2、非阻塞 父进程会去查看子进程状态改变,但是如果没有发生改变,父进程不会阻塞,程序继续往下
非阻塞必须套在循环中处理 //轮询
多任务的技术:线程
线程
概念:
线程 --- 轻量级的进程(light weight)
为什么需要:
进程的产生 --- fork
线程 --- 轻量级的进程
进程 --- 重量级的进程
线程 成为 CPU执行的最小单位
进程 成为 资源分配的基本单位
线程 创建和调度 时空开销都比进程小
组成:
线程tid //thread
程序计数器
寄存器集合
栈
线程与进程的关系:
1、线程是存在于进程中的
2、线程共享了进程的资源(代码段 ,数据段,打开一些文件)
3、线程结束,不一定导致进程结束
线程的编程:
类似于进程过程:
线程函数 NPTL
创建,执行,退出,资源回收
pthread_create
创建一个指定的线程
参数:
thread 线程id,需要实现定义并由该函数返回
attr 线程属性,一般是NULL,表示默认属性(可结合性+分离属性)
默认(可结合性)--- 自己手动回收
分离属性 --- 系统自动回收
start_routine --- 线程执行函数(线程回调函数)(线程回调函数 --- 完成线程任务功能的函数 需要调用者自己实现)
指向指针函数的函数指针
本质上是一个函数的名称即可
arg 回调函数的参数,即参数3的指针函数参数
返回值:
成功 返回0
错误 返回出错码(随机数)
编译时需要加 -lpthread
注:
主函数所在的执行流 --- 主线程
其他的线程 --- 子线程(次线程)
各个线程间地位是平等的 //对等
获得线程的tid:
pthread_self(); //在哪个线程调用就获得哪个线程的tid
pthread_exit
结束调用的线程
参数:
retval //退出状态值(地址)
注意:
1、pthread_exit 本身表示结束线程
如果用在main函数中 表示主线程结束
主线程结束 不代表进程结束
此时,主线程执行流结束,进程会在其余线程都结束后结束
pthread_join
等待线程结束
参数:
thread 线程tid
retval 用来保存退出状态值所在空间的地址
返回值:
成功 0
失败 错误码
注:
线程退出时,可以带出退出状态值,但是传的是,退出状态值的地址
---------------------------
嵌入式学习第二十七天,今天讲了关于进程结束后退出时父进程对子进程的资源回收,有两个函数可以实现,其中waitpid可以使父进程非阻塞。之后还学习了多任务技术,线程的知识。线程是轻量级的进程,还学习了关于线程的一些函数,线程的创建,运行,结束和等待结束。后面继续加油!