进程和线程

接上节进程

一、函数接口

1、exit

原型:void exit(int status);

功能:

让进程结束

在主函数中调用exit和return效果相同

2、_exit

原型:void _exit(int status);

功能:

直接让进程结束

exit:刷新缓存区,执行一系列进程退出注册的操作,最后让进程结束

_exit:不会刷新缓存区,直接让进程结束

3、wait

原型:pid_t wait(int *wstatus);

功能:

回收子进程空间

参数:

wstatus:存放子进程结束状态空间的首地址

返回值:

成功返回回收到的子进程的PID

失败返回-1

wait:具有阻塞功能,子进程没结束,父进程阻塞等待子进程结束,回收子进程空间

WIFEXITED(wstatus):判断子进程是否正常退出

WEXITSTATUS(wstatus):获得子进程结束时的值

WIFSIGNALED(wstatus):判断子进程是否被信号杀死

WTERMSIG(wstatus):获得杀死子进程信号的值

WCOREDUMP(wstatus):判断子进程是否段错误退出

WIFSTOPPED(wstatus):判断子进程是否被停止

WSTOPSIG(wstatus):获得停止子进程的编号

WIFCONTINUED(wstatus):判断进程是否继续执行

4、waitpid

原型:pid_t waitpid(pid_t pid, int *wstatus, int options);

功能:

回收指定的子进程空间

参数:

pid:回收子进程的ID号、-1表示任意子进程

wstatus:存放子进程结束状态空间的首地址

options:

0 阻塞回收

WNOHANG 非阻塞回收

返回值:

成功返回回收到的子进程的PID

失败返回-1

如果WNOHANG设置,没有子进程结束,返回0

wait(NULL) == waitpid(-1, NULL, 0);

二、 进程的消亡

  1. 僵尸态进程如何产生

进程代码执行结束,但是空间没有被回收

  1. 如何避免产生僵尸进程

让父进程先结束,子进程成为孤儿进程,孤儿进程会被init进程收养,子进程结束,init回收子进程空间,避免产生僵尸进程

子进程结束,父进程回收子进程空间,避免产生僵尸进程

三、 exec函数族

int execl(const char *path, const char *arg, .../* (char *) NULL */);

int execlp(const char *file, const char *arg, .../* (char *) NULL */);

int execle(const char *path, const char *arg, .../*, (char *) NULL, char

* const envp\[\] */);

int execv(const char *path, char *const argv\[\]);

int execvp(const char *file, char *const argv\[\]);

int execvpe(const char *file, char *const argv\[\], char *const envp\[\]);

功能:

利用进程空间执行另外的一段代码

l:参数以列表形式传递

v:参数以指针数组形式传递

p:在环境变量PATH对应的目录下找file

e:更新进程的环境变量

四、线程

1、线程的概念:

线程是轻量级的进程

  1. 进程和线程的区别:

(1)进程的空间是独立的

(2)线程空间位于进程空间内部,独享栈区(每个线程栈区独立),共享文本区、数据区、堆区(一个进程中的多个线程共用以上区域)

(3)进程是操作系统资源分配的最小单元

(4)线程是CPU任务调度的最小单元

  1. 线程的创建:

每个线程会创建一个属于该线程的独立的栈空间默认为8M,文本区、数据区、堆区使用进程

中的区域

  1. 线程的调度:

等同于进程调度

宏观并行,微观串行

  1. 线程的消亡

等同于进程的消亡,线程消亡需要回收线程空间

  1. 多进程和多线程优缺点:

进程:

(1)每个进程空间独立,安全性好,一个进程异常崩溃不会影响其余进程

(2)多进程调度,效率低,因为切换进程任务时需要映射不同的物理地址空间,增大系统开

销

(3)多进程通信不方便,因为空间独立,没有共享空间

(4)进程考虑资源竞争问题,因为没有共享空间

线程:

(1)线程位于进程空间内部,线程异常崩溃会导致进程崩溃,进程中其余的线程均结束

(2)多线程调度,效率高,因为在同一进程空间内部切换不同的任务

(3)多线程通信非常方便,多线程数据区、堆区共享

(4)通过锁的机制防止资源竞争

  1. 线程相关函数接口:

(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:线程函数的参数

返回值:

成功返回0

失败返回非0

相关推荐
迅猛龙办公室4 分钟前
python实现倒序输出数字
开发语言·python
夏幻灵6 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码6 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
bkspiderx8 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆8 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光8 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
码云数智-园园8 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
禾小西9 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨9 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言
SuperByteMaster10 小时前
wfi进入之前没有清除basepri, 导致中断优先级不够,wfi 退不出来
c语言