1.wait函数
父进程要获得子进程的退出状态
子进程
exit(退出状态值)
退出状态值 只有最低8位有效[0~255]
父进程
wait(&status)
获取到退出状态值
WIFEXITED()//先判断是否为正常退出
WEXITSTATUS()//获取到exit传递的退出状态值
2.waitpid函数
功能:等待子进程状态发生变化
参数:
@pid pid>0 //表示等待 指定的子进程状态改变
eg:100 //表示等待pid号为100的子进程状态改变
@wstatus //表示获取到 子进程 状态信息
@options //选项
//可以不阻寒
//默认是阻塞
wait(&wstatus) <==>waipid(-1,&wstatus,0)
pid =-1 //表示等待所有子进程
非阻塞调用:
waitpid(-1,&wstatus,WNOHANG) //表示非阻塞调用
非阻塞调用和阻塞调用的区别
1.阻塞
会影响父进程处理逻辑
2.非阻塞
父进程回去查看子进程的状态变化,但是,如果没有发生变化,父进程不阻塞,整个程序继续往下。
注:非阻塞必须套在循环中处理。 // 轮询
总结:1.wait 和waitpid都是等待子进程状态发生改变
2.wait是一种阻塞调用 --- 调用进程,一般不做额外的事情
3.waitpid可以实现非阻塞调用 ---- 调用进程,逻辑一般不受影响。
3.线程 多任务技术
1.线程 -- 轻量级的进程
进程 -- 重量级的进程
线程成为cpu执行的最小单位
进程成为资源分配的基本单位
线程 创建 和调度时空开销都比进程小
2.线程组成
线程tid 、程序计数器、寄存器集合、栈
3.线程与进程的关系
1.线程是存在与进程中的
2.线程共享了进程的资源(代码段,数据段,打开一些文件,信号等)
3.线程结束,不一定导致进程结束
5.线程的编程
1.线程的创建 pthread_create函数
功能:该函数可以创建指定的一个线程
参数:@thread :线程id,需要实现定义并由该函数返回。
@attr :线程属性,一般是NULL,表示默认属性。
默认(可结合性) -- 自己手动回收
分离属性 -- 系统自动回收
@start_routine -- 线程的执行函数(线程回调函数)
//指向指针函数的函数指针
th 回调函数,是线程的执行空间
注:线程回调函数 -- 完成线程任务功能的函数 ,需要调用者,自己实现
@arg 回调函数的参数,即参数3的指针函数参数。
返回值:成功 : 0 失败 :错误码
注:1.主函数所在的执行流 ---- 主线程
2.其它的线程 ---- 子线程(次线程)
3.各个线程间,地位是平等的 //对等
获得线程tid:
pthread_self(); //在那个线程中调用,获得的就是哪个线程的tid
2.线程的退出
1.pthread_exit函数
功能:结束调用的线程
参数: @retval //退出状态值//传的是退出状态值对应的地址
注:1.pthread exit 本身表示结束线程,如果用在main函数中, 表示结束主线程,主线程结束 并不表示进程结束,此时,主线程执行流结束,进程会在其余线程都结束后结束。
3.线程的资源回收
功能:等待线程结束
参数:@thread --- 线程tid
@retval ----用来保存,退出状态值所在空间的地址
返回值 : 成功 :0 失败: 错误码
编译的时候:gcc pthread_exit.c -lpthread