学习记录第二十五天
wait函数
wait函数是一个系统调用,用于等待一个子进程结束并回收其资源。当父进程调用wait函数时,它会暂停执行,直到至少有一个子进程结束。wait函数的原型如下:
#include <sys/types.h>
#include <sys/wait.h>pid_t wait(int *status);
1.status参数是一个指针,用于存放子进程的退出状态信息。如果不需要检查子进程的退出状态,这个参数可以设置为NULL。
2.如果wait函数成功,它返回结束的子进程的进程ID。
3.如果调用wait函数的进程没有子进程结束,或者在等待期间被信号中断,wait函数返回-1
waitpid函数
waitpid函数提供了比wait更加灵活的接口,允许父进程等待特定的子进程结束,或者设置不同的等待选项。waitpid函数的原型如下:
#include <sys/types.h>
#include <sys/wait.h>pid_t waitpid(pid_t pid, int *status, int options);
1.pid参数指定了要等待的子进程的进程ID。
2.status参数是一个指针,用于存放子进程的退出状态值,退出状态值 只有最低8位有效 [0~255]
3.options参数可以包含不同的标志,用于控制waitpid的行为,例如WNOHANG使waitpid在没有子进程结束时立即返回,而不是等待。
4.waitpid函数在成功时返回等待的子进程的进程ID,失败时返回-1。
使用场景和差异
wait函数适用于简单的场景,即父进程等待任意一个子进程结束。而waitpid函数则适用于需要更多控制的场景,例如等待特定的子进程、等待进程组中的任一子进程或所有子进程,或者在不阻塞父进程的情况下进行等待。
waitpid函数的options参数提供了额外的灵活性,使得父进程可以根据需要调整等待行为。例如,使用WNOHANG选项可以避免父进程在没有子进程结束时被阻塞,这在编写交互式程序时非常有用。
在实际应用中,开发者应该根据具体的进程管理需求选择合适的函数。如果需要等待所有子进程结束并重拾资源,wait函数通常足够使用。如果需要更精细的控制,waitpid函数则是更好的选择。
线程
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以拥有多个线程,这些线程共享进程的资源(如内存空间),但每个线程有自己的寄存器和局部变量。
线程的关键特点:
1.轻量级:线程之间的切换比进程之间的切换要轻量级,因为线程共享同一进程的资源,不需要进行系统调用,所以线程的创建和销毁成本较低。
2.共享资源:同一进程内的线程共享进程的数据空间,这意味着它们可以访问相同的全局变量和文件句柄。这在需要线程间通信时非常便捷,但同时也需要小心处理并发访问,以避免数据不一致或死锁问题。
3.并发执行:线程可以并发执行,这意味着在多核处理器系统中,不同的线程可以在不同的处理器核心上同时运行,从而提高应用程序的执行效率。
线程与进程的关系
1.区别:线程是操作系统调度的基本单元,而进程是资源分配的基本单元。进程之间是独立的,有独立的地址空间;而线程之间共享同一进程的地址空间和资源,通信更直接和快速。
2.联系:线程是进程的一部分,一个进程可以拥有多个线程,所有线程共享进程的资源,但每个线程有自己的执行栈和寄存器。
pthread_create函数
pthread_create函数是用于在POSIX兼容的系统中创建新线程的标准库函数。它定义在<pthread.h>头文件中,并允许用户指定线程的属性、启动函数以及传递给该函数的参数。
函数原型
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine)(void *), void *arg);
参数解释
1.thread:指向pthread_t类型变量的指针,该变量将接收新创建线程的ID。
2.attr:指向pthread_attr_t类型变量的指针,用于设置线程的属性,如堆栈大小、调度策略等。如果不需要特殊设置,可以传递NULL以使用默认属性。
3.start_routine:指向线程执行函数的指针,该函数的原型为void *(*start_routine)(void *),即接受一个void *类型的参数并返回一个void *类型的值。
4.arg:传递给线程执行函数的参数,类型为void *。
返回值
1.如果线程创建成功,返回0。
2.如果创建失败,返回错误代码。
pthread_exit函数
pthread_exit函数用于正常结束一个线程,并可以设置线程结束时的返回值。当一个线程调用pthread_exit时,它立即停止执行,并将控制权返回给线程调度器。如果pthread_exit的参数不是NULL,该值将作为线程的返回状态传递给任何后续调用pthread_join的线程。
函数原型
void pthread_exit(void *retval);
参数解释
1.retval:指向要传递给pthread_join的线程返回值的指针。如果线程结束时不需要传递返回值,可以传递NULL。
返回值
pthread_exit函数本身没有返回值,因为它用于结束当前线程的执行。
使用场景
pthread_exit通常在以下情况下使用:
1.当线程完成了其任务,需要立即结束时。
2.当线程遇到错误或异常情况,需要提前退出时。
pthread_join函数
pthread_join函数用于等待一个特定的线程结束,并从该线程中检索其返回值。这个函数是线程间同步的一种机制,可以确保主线程或其他线程在继续执行之前等待某个线程完成其工作。
函数原型
int pthread_join(pthread_t thread, void **retval);
参数解释
1.thread:待等待结束的线程的ID。
2.retval:指向变量的指针,用于存储被等待线程的返回值。如果不需要获取返回值,可以传递NULL。
返回值
1.如果函数成功,返回0。
2.如果发生错误,返回相应的错误码。
使用场景
pthread_join通常用于以下场景:
1.当主线程需要等待子线程完成任务并获取结果时。
2.当需要确保某个线程在程序的其他部分之前完成执行时。
#include<stdio.h>
#include <pthread.h>void *str1(void *arg)
{static char *s = "Hello World!";puts(s);pthread_exit(s);
}int main(void)
{pthread_t tid;int ret = pthread_create(&tid,NULL,str1,NULL);void *retid;pthread_join(tid,&retid);printf("exit = %s\n",(char *)retid);return 0;
}
相关文章:
学习记录第二十五天
wait函数 wait函数是一个系统调用,用于等待一个子进程结束并回收其资源。当父进程调用wait函数时,它会暂停执行,直到至少有一个子进程结束。wait函数的原型如下: #include <sys/types.h> #include <sys/wait.h>pid_…...
C语言:字符串函数strcmp
该函数用于比较两个字符串是否一样。 使用方法如下: #include<stdio.h> #include<string.h>int main() {//strcmp函数返回值有三种情况,小于零时返回-1,等于零,大于零时返回1printf("%d\n", strcmp("…...

【数据分析---偏企业】 Excel操作
各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 Excel操作前 必看 Python 初阶 Python—语言基础与…...

Ajax-01.原生方式
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Ajax-原生方式</title> </head> <!-…...

OpenAI GPT-2 model use with TensorFlow JS
题意:使用 TensorFlow JS 应用 OpenAI GPT-2 模型 问题背景: Is that possible to generate texts from OpenAI GPT-2 using TensorFlowJS? 是否可以使用 TensorFlowJS 生成 OpenAI GPT-2 的文本? If not what is the limitation, like mo…...

JVM-运行数据区(堆、栈、元空间)
文章声明:文章图片均来自互联网,因为本人画的图不够生动。 运行数据区是JVM最重要的一个区域。 运行数据区由栈、堆、元空间构成。 栈:程序计数器、JVM虚拟机栈,本地方法栈 本地方法栈:加载native修饰的方法&#…...

超详细!!! LVS(Linux virual server)负载均衡知识及其NAT模式、DR模式、火墙标记实验
目录 前言系统性能扩展方式集群Cluster分布式集群与分布式 四层转发与七层转发的区别 LVS(Linux virual server)一、LVS介绍LVS相关概念 二、LVS集群结构体系1. 负载均衡层(Load Balancer)2. 服务器群组层(Server Pool…...
信息学奥赛一本通1259:【例9.3】求最长不下降序列
题目: 1259:【例9.3】求最长不下降序列 时间限制: 1000 ms 内存限制: 65536 KB 提交数:51218 通过数: 20928 Special Judge 【题目描述】 设有由n(1≤n≤200)n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、…...
星露谷模组开发教程#3 事件
首发于Enaium的个人博客 SMAPI提供了一些事件,比如游戏的内容、显示、输入等事件。这些事件可以让我们在游戏中添加自己的逻辑。这一节我们就来看看如何使用这些事件。 注册一个事件 在SMAPI中,我们可以通过IModHelper的Events属性来注册事件。比如我们…...

C语言程序设计(初识C语言后部分)
愿天下无Bug,秀发常驻。 3)函数的参数 1.实际参数(实参): 真实传给函数的参数,叫实参。 实参可以是:常量、变量、表达式、函数等。 无论实参是何类型的量,在进行函数调用时&#…...

驱动基础开发
1、字符设备传统开发模板 字符设备驱动框架,首先我们需要去用module_init这个宏去修饰整个驱动的入口函数,用module_exit去修饰整个驱动的出口函数,然后还需要用MODULE_LICENSE用于声明模块的许可证类型。 在入口函数里面我们需要注册字符设…...

从苹果AppStore看AI开发者生态
从苹果 App Store 看 AI 开发者生态 在人工智能迅速发展的今天,我们不禁要问:未来的 AI 开发者生态将会是什么样子?为了回答这个问题,我们不妨回顾一下移动互联网时代最成功的开发者生态之一——苹果的 App Store。 通过分析 App …...

【Python学习-UI界面】PyQt5 小部件1-Label
QLabel 对象可用作显示不可编辑的文本、图像或动态GIF影片的占位符。 它还可以用作其他小部件的助记键。 标签可以显示普通文本、超链接或富文本。 1、普通文本 直接双击输入即可 2、添加超链接 选中对应Label,右键选择多信息文本,添加链接,…...

【Linux详解】进度条实现 Linux下git 的远程上传
📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 🚀前言 &#x…...

Android进阶之路 - res、raw、assets 资源解析、区别对比
那天遇到一个资源目录层级的问题,索性重新整理记录一下,希望能帮到如吾往昔之少年的你们,哈哈哈哈哈哈… 一脸茫然,越写越多,时间成本属实有点大,就当一起来基础扫盲吧 resdrawablemipmapvaluescolor asset…...

从数字化到数智化:消费零售企业如何实现门店数智化管理?
随着信息技术的飞速发展,数字化已成为企业转型的必经之路。然而,数字化本身并不是目的,而是通往数智化的桥梁。数智化,即数据智能化,是指企业通过数字化手段收集和分析数据,进而利用这些数据驱动决策和创新…...
Linux中ES的安装
文章目录 一、ES是什么1.1、ES概念介绍1.2、技术架构1.2.1、Lucene介绍 1.3、ES的工作原理1.4、ES的适用场景 二、安装前的配置2.1、创建普通用户2.2、调整文件描述符数量和虚拟内存2.3、设置shell会话的资源限制(软限制和硬限制)2.4、增加虚拟内存的设置…...

Redis远程字典服务器(5) —— hash类型详解
目录 一,hash基本情况 二,hash常用命令详解 2.1 hset,hget,hexists,hdel 2.2 hexists,hdel 2.3 hkeys,hvals 2.4 hgetall,hmget 2.5 hlen,hsetnx 2.6 hincrby&am…...

MySQL | 行锁——记录锁、间隙锁 、临键锁、插入意向锁
1、InnoDB中的行锁 行锁(Row Lock) 也称为记录锁,顾名思义,就是锁住某一行(某条记录row)。需要注意的是,MySQL服务器层并没有实现行锁机制,行级锁只在存储引擎层实现。 优点&#x…...

【网络编程】TCP通信基础模型实现
tcpSer.c #include <myhead.h> #define SER_IP "192.168.119.143" // 设置IP地址 #define SER_PORT 6666 // 设置端口号 int main(int argc, const char *argv[]) {// 1.创建socketint serfd socket(AF_INET, SOCK_STREAM, 0);// 参数1表示ipv4// 参数2表…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...