一、非阻塞和阻塞
· 非阻寨调用:
waitpid(-1,&wstatus,WNOHANG);
1.阻塞
会父进程处理逻辑
2.非阻塞
父进程 会去查看 子进程状态改变,但是,如果没有发生改变,父进程不阻塞,整个程序继续往下
总结:
一、1.wait 和 waitpid都是 等待子进程状态改变
2.wait是一种阻塞调用
3.waitpid 可以实现非阻塞调用
二、1.创建---fork
//创建一个子进程
//创建多个子进程
//创建好之后,能区分父子进程代码的逻辑
2.执行
a.做与父进程相同的事情
b.做与父进程不同的事情
fork +exec //minishell
3.进程的退出
return
exit
_exit
4.两个特殊状态
孤儿进程---没有危害,不需要处理
僵尸态进程---处理工
wait
waitpid
二、多任务的技术:线程
1.什么是线程
线程是 CPU 使用的基本单元,它由线程ID、程序计数器、寄存器集合和栈组成。它与属于同一进程的其他线程共享代码段、数据段和其他操作系统资源,如打开文件和信号。一个传统重量级(heavyweight)的进程只有单个控制线程。如果进程有多个控制线程,那么它能同时做多个任务。
传统单线程进程和多线程进程的区别:
2.线程的产生——fork
线程—轻量级的进程
进程—重量级的进程
线程的创建和调度都比进程小
3.线程的组成
4.线程与进程的关系
1.线程是存在于进程中的
2.线程共享了进程的资源(代码段,数据段,打开文件,信号等)
3.线程结束,不一定导致进程结束
5.线程的编程
过程与进程类似
线程的(创建——执行——退出——资源回收)
创建:
int pthread_create(pthread_t *thread, const pthread_attr_t*attr, void *(*start_routine)(void *)
void *arg);
功能:该函数可以创建指定的一个线程。
参数:
thread 线程id,需要实现定义并由该数返回。
attr 线程属性,一般是NULL,表示默认属性。(可结合性+分离属性)
start_routine 线程执行函数(线程回调函数)
是线程的执行空间。
arg 回调函数的参数。
(主函数所在的执行流叫做主线程,其他的线程叫做子线程或次线程。且各个线程之间地位平等。)
获得tid:pthread_self();
在哪个线程中调用,获得 哪个线程的tid;
执行:
体现在执行函数(回调函数)上
退出:
方式1:pthread_exit
void pthread_exit(void *retval)
功能:结束调用的线程
参数:retval
注意: pthread exit 本身表示结束线程,如果用在main函数中表结束主线程,主线程结束 并不表 示进程,此时,主线程执行流结束,进程会在其余线程都结束后结束。
资源回收:
int pthread_join(pthread_t thread, void **retval);
功能:等待线程结束
参数:thread ——线程tid
retval ——用来保存,退出状态值所在空间的地址
返回值:成功 0;失败 错误码。