进程的退出两大类:
正常退出 return 从main函数 exit atexit (注册 "退出清理函数" 的函数)
_exit
异常退出 ---信号结束掉 abort signal
pid_t wait(int *wstatus);
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
功能:(1)获得子进程退出状态(2)回收资源,让僵尸态子进程销毁
注意(1)wait本身是一个阻碍操作,会使调用者阻塞;
(2)父进程获得子进程的退出状态,子进程:只有最低8位有效;
父进程wait获得退出状态值WIFEXITED()先判断是否正常退出;
WEWXITSTATUS获得退出状态值的原数字;
pid_t waitpid(pid_t pid, int *wstatus, int options);
功能:等待子进程状态发生变化
参数:pid = -1 表示等待所有子进;pid > 0 表示等待 指定的子进程状态改变
wstatus 表示获取到 子进程 状态信息
options 选项;可以不阻塞 WNOHANG 默认是阻塞 0
wait(&wstatus) <=> waipid(-1,&wstatus,0)
非阻塞调用:
waitpid(-1,&wstatus,WNOHANG);表示非阻塞调用
非阻塞和阻塞
1.阻塞 会父进程处理逻辑
2.非阻塞 父进程 会去查看 子进程状态改变;但是,如果没有发生改变,父进程不阻塞;整个程序继续往下 非阻塞 必须 套在循环中处理(轮询 )
总结:1.wait 和 waitpid都是 等待子进程状态改变
2.wait 是一种阻塞调用
3.waitpid 可以实现非阻塞调用
进程退出:
处理方式
wait 阻塞方式:调用进程 一般不做额外的事情
waitpid 非阻塞的方式:调用进程 逻辑一般不受影响waitpid 想要处理到子进,必须套在循环中;
多任务的技术: 线程
1.什么是线程:线程 --轻量级的进程 light weight
进程 --重量级的进程 heavy weight
2.为什么需要线程?
进程的产生 ----- fork
线程 成为 CPU执行的最小单位
进程 成为 资源分配的基本单位
线程创建和调度时空开销都比进程小
3. 线程组成:线程tid 号(thread) 程序计数器,寄存器集合,栈
程序计数器 寄存器集合 栈 属于线程独立拥有,
一条执行流;单线程进程;多线程共享进程资源;
4. 线程与进程的关系
1.线程是存在于进程中的
2.线程共享了进程的资源 (代码段,数据段,打开一些文件,信号等)
3.线程结束,不一定导致进程结束
5.线程的编程
与进程过程相似
线程—创建—执行—退出—资源的回收
线程函数
(1)线程的创建 pthread_create
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg);
功能:该函数可以创建指定的一个线程。
参数: thread 线程id,需要实现定义并由该函数返回。
attr 线程属性,一般是NULL,表示默认属性。(可结合性+分离属性)
默认(可结合性) -- 自己手动回收
分离属性 -- 系统自动回收
start_routine -- 线程执行函数 (线程回调函数)指向[指针函数的] 函数指针。
本质上是一个函数的名称即可。称为回调函数,是线程的执行空间。
注: 线程回调函数 --完成线程任务功能的函数(需要调用者自己实现)
@arg 回调函数的参数,即参数3的指针函数参数。
返回值:成功 0;失败 错误码
获得线程tid:
pthread_self();(在哪个线程中调用,获得的就是那个线程的tid)
注:1. 主函数所在的执行流 --- 主线程
2. 其它的线程 --- 子线程(次线程)
3. 各个线程间 低位是平等 //对等
(2)线程的执行 --- 就体现在线程的 执行函数(回调函数)上
(3)线程的退出
方式1
pthread_exit
void pthread_exit(void *retval)
功能:结束调用的线程
参数:retval 退出状态值(传的是退出状态值对应的地址)
注意:pthread_exit 本身表示结束线程;如果用在main函数中 表示结束主线程结束,并不表示进程;此时,主线程执行流结束,进程会在其余线程都结束后,结束
(4)线程的资源回收
int pthread_join(pthread_t thread, void **retval);
功能:等待线程结束
参数:thread --- 线程tid
retval --- 用来保存,退出状态值,所在空间的地址
返回值:成功 0;失败 错误码
注:线程退出时,可以带出退出状态值;但是传的是,退出状态值对应空间的地址