一.进程空间的回收
1.wait
pid_t wait(int *status);
功能:该函数可用于阻塞等待任意子进程退出并回收进程的状态
参数:status进程退出时候的状态
如果不关心其退出状态一般用NULL表示
如果要回收进程退出状态,WEXITATUS回收
返回值:成功回收子进程pid 失败-1
父进程要获得子进程的退出状态
子进程:exit(退出状态值) 退出状态值只有最低8位有效数字
父进程:wait (&status)
获取到退出状态值 ,WIFEXITED //先判断是否正常退出
WEXITSTATUS // 获取到exit传递的退出状态值
2. waitpid
pid_t waitpid(pid_t pid, int *status, int options);
功能:等待子进程状态发生变化
参数:pid >0 表示等待指定的子进程状态发生改变
wstatus:表示获得取到子进程状态信息
options :选项 可以不是阻塞(WNOHANG) 默认是阻塞0
注:如果pid = -1 表示waitpid会等待任何子进程
非阻塞调用: waitpid(-1,status,0)=wait(status)
1)阻塞会影响父进程处理逻辑
2)父进程会去查看子进程状态变化
如果未发生变化,父进程不阻塞整个程序继续向下
非阻塞必须在循环里使用
二.线程
1.什么是线程
线程---轻量级的进程
进程---重量级的进程
2.为什么需要线程
进程的产生---fork
进程是分配资源和调度执行的基本单位。
进程是程序执行和资源管理的最小单位。
3.线程的组成
线性tid // thread 程序计数器 寄存器集合 栈
4.线程与进程的关系
1)线程是存在于进程中的
2)线程共享了进程的资源(代码段,数据段,打开的一些文件)
3)线程结束不一定导致进程结束‘
5.线性的编程
a.创建
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 失败 错误码
注:1.编译时加-lpthread
2.判断返回值时自己定义error
3.主函数所在的执行流---主线程
其他的线程---子线程
各个线程之间地位平等
b.执行 就体现在线程的执行函数(回调函数)
c.退出
void pthread_exit(void *retval);
功能:子线程自行退出
参数: retval 线程退出时候的返回状态。
注:pthread_exit 本身表示结束线程
如果用在mian 函数中,表示结束主线程
主线程结束并不表示进程,此时进程会在其余线程结束后结束
d. 资源回收
int pthread_cancel(pthread_t thread);
功能:请求结束一个线程
参数:thread 请求结束一个线程tid
返回值:成功 0,失败 -1;
注:线程退出时,可以带出退出的状态值,但是传的是退出状态值对应的空间的地址。