【Linux操作系统】简学深悟启示录:进程初步

【电机控制入门】——电机控制书籍推荐 电机控制入门书籍推荐及分享 阅读须知: 1.电机控制的入门是涉及到机械、电子与控制等复杂交叉学习,它需要持续投入时间才可以看到学习的效果,如同“一万小时定律”。俗话说,九层之台,起于垒土,因此电机控制入门没有所谓的速成培训班。相反,还需要夯实好一定的基础。为此,博主建议从基础理论抓起,故推荐相关的书籍并分享给大家。 2.学习电机贵在动手实践,无论是借助于MATLAB/Simulink仿真平台来验证理论分析,或是使用板子对所设计的控制系统进行物理实现,博主极力推荐在一定基础(看完部分以下推荐的书籍),一边动手 阅读详情
AI摘要

本文介绍了Linux操作系统中进程的基本概念及其实现方式。首先回顾了冯诺依曼体系和操作系统的功能,随后详细讲解了进程的定义、状态、查看方法以及如何通过函数获取进程ID。最后探讨了进程的创建机制及其在内核中的表现形式。

在操作系统中,进程(Process) 是程序的一次动态执行过程,是系统进行资源分配和调度的基本单位。简单来说,当你运行一个程序(如打开浏览器、启动一个 Python 脚本),操作系统就会创建一个进程,并为其分配内存、CPU 时间等资源,使其能够执行

1.进程先前知识铺垫

1.1 冯诺依曼体系

在这里插入图片描述

如图所示,计算机底层的硬件都要遵守该体系,大致由四部分组成:

  • 输入设备: 鼠标、键盘、摄像头、话筒、硬盘、网卡…
  • 存储器: 简单来说就是内存
  • 输出设备: 显示器、播放器硬件、磁盘、网卡…
  • 中央处理器: 即 CPU,包括运算器和控制器,对我们的数据进行计算任务(算数逻辑),以及流程进行控制

有的设备是纯输入、输出设备,有的既是输出也是输入设备

一个程序要运行,必须先从输入设备进入存储器,到 CPU 处理之后,再回到存储器,由输出设备让我们看到处理结果。该体系规定不能跳过存储器直接与 CPU 交互,简单来说就是所有设备都只能直接和内存打交道

🤔为什么必须按照这种流程?

CPU 的运算速度(纳秒级)远超外部存储设备(如硬盘、U 盘,毫秒级甚至秒级)。存储器的运算速度是适中的,如果没有存储器(尤其是内存)作为 “高速缓冲中转站”,CPU 会被外部设备的慢速拖垮 —— 每次运算都要等外部设备慢吞吞地传输数据,效率会下降几万甚至几十万倍

1.2 操作系统

在这里插入图片描述
操作系统是一款进行软硬件管理的软件,对下通过驱动对硬件进行控制计算的管理,对上提供统一的接口供代码调用

🤔为什么操作系统只提供接口用于调用呢?

操作系统里有各式各样的数据,为了保护数据安全,也为了能给用户提供安全稳定的服务,让所有访问操作系统的行为,通通转化为系统调用完成

🤯操作系统是如何进行管理的?

在这里插入图片描述

先说结论,总结起来就是 “先描述,再组织”,以学校管理学生的入学档案数据为例,每个学生的个人信息就是一份档案,即 struct 结构体节点,将每个节点通过双向链表链接起来,即可以通过增删查改对数据进行管理,这就是操作系统的做法

2.进程

2.1 概念

既然了解了以上知识,那么进程应该是不难理解了,简单来说,进程就是一个已经加载到内存里的程序,叫做进程,也叫任务

每当有一个进程创建的时候,就会对应创建一个 PCB(process control block)对象,在 Linux 下 PCB 的具体实现是一个个的 task_struct。PCB 是描述对象的属性的集合

🚩task_ struct内容分类:

  • 标示符: 描述本进程的唯一标示符,用来区别其他进程
  • 状态: 任务状态,退出代码,退出信号等
  • 优先级: 相对于其他进程的优先级
  • 程序计数器: 程序中即将被执行的下一条指令的地址
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图 CPU,寄存器]
  • I/O状态信息: 包括显示的 I/O 请求,分配给进程的 I/O 设备和被进程使用的文件列表
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
  • 其他信息

进程 = 内核 PCB 数据结构对象 + 你自己的代码和数据

2.2 查看进程

在这里插入图片描述

我们将以 process.cpp 这个循环输出的文件为例子查看进程状态(已配置 makefile 文件),下面提到的 PID 表示该进程的 ID 值,PPID 表示该进程的父进程(进程中创建进程后,实行创建的那个进程就叫父进程,被创建的那个就是子进程)

2.2.1 ps用户级工具获取

ps 是 Linux 系统中用于查看进程状态的命令,全称是 Process Status。它可以显示当前系统中运行的进程信息,包括进程 ID(PID)、运行状态、CPU 占用率、内存使用等

在这里插入图片描述

  • a:显示所有用户的进程(包括其他用户的进程)
  • j:以作业控制格式显示(包含 PPID 父进程 ID、PGID 进程组 ID、SID 会话 ID 等字段)
  • x:显示不关联终端的进程(如后台运行的进程、服务进程等)

ps ajx | head -1 && ps ajx | grep ./process 表示查看进程,显示出第一行的信息,并截取 ./process 这一条进程,grep --color=auto ./process 由于 grep 需要高亮显示而创建的进程

可以看到该进程的 PID 为 20662,父进程为 18495

在这里插入图片描述

再去查看对应的父进程,发现是一个名为 bash 的进程。实际上,bash 是当前登录的终端交互系统的进程,大多数命令其直接父进程通常都是当前的 bash

2.2.2 系统文件查看

在这里插入图片描述

根据进程的 PID 同样可以直接在系统目录 proc 下查找到对应进程

2.3 函数获取进程ID

在这里插入图片描述

getpid():用于获取当前调用进程的进程 ID(PID)。这个 PID 常被用于生成唯一的临时文件名等场景
getppid():用于获取当前调用进程的父进程的进程 ID(PPID)

🔥值得注意的是: 使用这两个函数需要包含 <sys/types.h> 和 <unistd.h> 这两个头文件,这两个函数总是成功的,不会返回错误

2.4 创建进程

在这里插入图片描述

fork 是用于创建新进程的指令,相当于创建该进程的子进程

当一个进程(称为父进程)调用 fork 时,系统会创建一个新的进程(称为子进程),我们知道 进程 = 内核 PCB 数据结构对象 + 你自己的代码和数据,子进程PCB还是会正常创建一个,但是自定义的数据代码就不一样了。举个例子,子进程和父进程相当于两个厨师,代码相当于菜谱,运行中的代码是不能被修改的,对于父子进程来说是共享的,就不需要再多一份浪费空间;数据相当于食材,虽然做的是同一道菜,但是肯定是两份食材,因为数据可能被修改,不可能共享同一份数据,子进程复制父进程的数据进行的是写时拷贝,只有需要修改的数据才会拿下来拷贝,避免多余的拷贝占用空间

返回值区分: 为什么要创建子进程?是为了让多个进程同时执行不同的事情,因此需要执行不同的代码块,通过 if-else条件句实现。fork 调用会在父进程和子进程中都返回,但返回值不同。在父进程中,fork 返回子进程的 PID;在子进程中,fork 返回 0 。通过判断 fork 的返回值,程序可以区分当前是在父进程还是子进程中执行

运行结果:

在这里插入图片描述

可以看出确实是有两个进程运行着,根据不同的分支的结果就能看出,那么我将提出三个细节上的问题

  1. 为什么fork要给子进程返回0,给父进程返回子进程PID?

子进程被创建后,其自身的 PID 对区分身份来说并非必需 —— 子进程若需要知道自己的 PID,可通过 getpid() 系统调用获取。更重要的是,子进程需要一个明确的信号来识别自己是子进程,而 0 恰好是一个理想的特殊值,因此 0 只作为标识,而不是有效的 PID

父进程创建子进程后,通常需要对其进行后续管理(如等待子进程结束、发送信号、监控状态等),而 PID 是进程的唯一标识,父进程必须知道子进程的 PID 才能执行这些操作

  1. fork函数是如何做到返回两次的?
    在这里插入图片描述

看到 fork 内部的函数结构,中间部分进行相应的子进程创建操作,在 return 操作前子进程就已经创建完毕了,既然 return 也是代码,那么就是共享的,父子进程就都会执行,即 fork 函数会有两次返回

  1. 父子进程谁先运行?

这个是无法确定的,由调度器的策略决定,调度器简单来说就是一个分配进程占据CPU运行效率的组件


希望读者们多多三连支持

小编会继续更新

你们的鼓励就是我前进的动力!

请添加图片描述

uniapp - H5网页uni.getLocation报错getLocation:fail Geolocation permission denied.Get ipLocation failed. uni.getLocation getLocation:fail Geolocation permission denied.Get ipLocation failed.,uni.getLocation定位失败,uni-app getLocation()无法获取定位,一直fail()uniapp移动端h5网页,uniApp微信内置浏览器定位失败,如何解决这个问题,uniapp h5 uni.getLocation获取位置失败怎么办,UNI-APP获取当前位置,uni.getLocation定位失败,unia 阅读详情

相关推荐

稳定性性能系列之十五——系统稳定性监控体系建设:从指标到预警的完整方案

深入探讨Android系统稳定性监控体系的设计与实现,涵盖指标体系设计、数据采集方案、异常检测算法、预警响应机制,并提供完整的监控平台搭建实践。

Cheson的专栏 1358

【Linux系统编程】进程概念详解(什么是进程?如何查看进程?)

​ 在学习了【Linux系统编程】中的 操作系统和冯·诺依曼体系结构之后,我们已经对系统应该有了不错的了解,接下里我们将继续深入的了解操作系统最重要的的功能之一:进程管理。 那么操作系统是如何进行进程管理的呢?------很简单,先把进程描述起来,再把进程组织起来! 那么进程又是什么呢?------所以本次博客将从进程讲起! ​

weixin_45031801的博客 2203

UFS 3.1协议分析(第五章) -- UFS协议栈

ContentsUFS顶层架构应用层UFS命令集UFS 设备管理器UFS任务管理器传输层互连层 UFS顶层架构     UFS基于SCSI SAM架构模型定义了一个完整的协议栈,从上到下依次为应用层、传输层、数据链路层、物理层。UFS使用MIPI联盟的UniPro作为数据链路层和MIPI的M-PHY作为物理层,两者合起来称之为互连层(UFS InterConnect Layer) 应用层     应用层包括UFS命令集、设备管

Frank_sample的专栏 7371

操作系统进程深度解析:从概念到实战

子进程终止后,父进程未调用wait()waitpid()回收,导致 PCB 残留(状态为Z父进程先于子进程终止,子进程被init收养(PPID 变为 1)。

JJC030210的博客 963

Python手记-9:Python LXML库XPath的爬取晋江书目

1. lxml库 lxml是功能最丰富且易于使用的库,用于处理Python语言中的XML和HTML,还可实现WEB爬取,官文参考:https://lxml.de/,完整的PDF文档下载链接https://lxml.de/lxmldoc-4.5.0.pdf,但是阅读起来……em……怪自己不够聪明的样子。 Linux下安装lxml库:[root@chengyu ~]# pip3 instal...

成屿的专栏 4万+

手把手教你在Keil/IAR中移植SEGGER_RTT组件(避坑指南+性能对比)

本文详细介绍了在Keil/IAR开发环境中移植SEGGER RTT调试组件的完整流程与优化技巧。通过对比传统串口调试,SEGGER RTT凭借零硬件占用、高速传输和双向交互等优势,显著提升嵌入式开发效率。文章包含配置步骤、性能调优方案及常见问题解决方案,是嵌入式开发者必备的实用指南。

y7z8a的博客 243

【进程的概念】由浅入深带你了解进程的概念

我们翻开任何一本教材,都会告诉你,加载到内存中的程序就是进程,这对于我们来说是无法理解的,接下来我将从另一个视角带你了解进程的概念。首先我们要知道什么是程序?程序员通过代码编译形成的磁盘二进制文件就是程序但是这个程序仅仅存在于磁盘当中,因此我们不能称之为进程,我们需要将这个程序运行起来才能称之为进程,但是我们应该怎么加载到内存里呢?

f040731_007的博客 1173

SAPIEN ManiSkill3 入门教程(一)

请注意,table.set_pose(pose) 设置的是演员在世界帧中的坐标系姿势。移除的实体可以再次添加到场景中,但已在场景中的实体则不能再次添加。显示器可以是物理的(如显示器),也可以是虚拟的(如 VNC)。我们可以通过 get_pose()、get_linear_velocity() 和 get_angular_velocity()获取演员的运动量(姿势、线速度、角速度)。现在,让我们创建一个斜坡。例如,您可能需要一个简单的碰撞形状来进行快速模拟,但却需要一个复杂的视觉形状来进行逼真的渲染。

机器人控制与仿真应用 3075

操作系统原理复习

2021软工操作系统原理复习 提示:张德军老师的提纲,看的万林老师的讲解ppt复习 有需求看,有错赶紧告诉我!!!晚上考!!! 目录2021软工操作系统原理复习复习前期提要一、引言掌握操作系统的概念了解操作系统的发展历史及各阶段主要特征了解操作系统的组成掌握操作系统的类型掌握系统调用、多道程序概念了解操作系统发展中的各类典型结构。了解操作系统的分层结构图进程概念什么是进程,进程与程序的区别是什么进程的基本状态进程状态的转换关系理解基于忙等待的互斥手段的实现掌握生产者-消费者问题掌握典型的调度算法,对常见的调

m0_46158035的博客 1893

液态神经网络(LNN):打破AI“静态快照”的连续动力学革命---AI大模型系统从零开始0029

MIT研究团队受秀丽隐杆线虫神经系统的启发,开发出革命性的液态神经网络(LNN)。该技术通过连续微分方程建模神经元动态,实现输入响应速度的自适应调节,解决了传统AI模型静态化、高能耗和低解释性的痛点。LNN具有三大突破性优势:仅需少量神经元(如20个)即可完成复杂任务;能处理非均匀时序数据;在自动驾驶、医疗监测等领域展现出卓越的适应性和鲁棒性。这项将生物智能与数学建模完美融合的技术,有望成为下一代AI的核心架构,目前已在无人机导航等场景验证了其高效性,被预测为2026年最具潜力的AI突破方向。

添柴程序猿的专栏 375

喷涂机器人系列编程:ABB IRB 5500_(2).ABB IRB 5500喷涂机器人系统架构与组件

ABB IRB 5500喷涂机器人系统不仅在性能上表现出色,而且在安全和维护方面也提供了全面的解决方案。通过本文的详细介绍,希望读者能够更好地理解和掌握这一系统的架构和功能,为实际应用提供有力支持。

zhubeibei168的博客 778

五分钟带你了解 计算机操作系统——进程与线程(万字详解·图文)

进程线程可以说是操作系统基础,看过很多关于这方面知识的文章都是纯理论讲述,我准备用图解的形式带你学习和掌握进程、线程。文字力求简单明了,对于复杂概念做到一个概念一张图解,在操作系统课程的学习中,很多人对进程线程有大体的认识,更加印象深刻。

感谢您的关注! 3094

24、企业治理、风险与合规:精益思维的应用与实践

本文探讨了如何运用精益思维优化企业治理、风险与合规(GRC)流程,分析了职责分离与合规流程的误区,提出了预防性与检测性控制措施的合理搭配,并通过价值流映射、减少合规反馈循环等方法实现流程优化。以Etsy的PCI-DSS实施为例,展示了如何在满足法规要求的同时保持创新活力。文章还强调了构建协作型GRC文化的重要性,并展望了未来GRC的发展趋势,包括数字化转型、全球化风险管理及与可持续发展的结合。

solidity8miner的博客 103

【Linux操作系统】简学深悟启示录:进程控制

本文主要介绍了Linux进程管理的三个关键方面:进程终止、进程等待及相关系统调用。首先补充了进程创建时的写时拷贝机制,当子进程修改共享数据时系统会触发只读保护并分配新空间。其次详细讲解了进程退出的三种情况及查看方法,对比了exit和_exit函数的区别。重点阐述了进程等待的必要性,通过wait和waitpid函数回收子进程资源并获取退出状态,其中waitpid可解析子进程退出码和信号信息。文章通过代码示例展示了如何正确使用这些系统调用来处理进程终止和等待,避免僵尸进程的产生。

Zero_VPN的博客 2432

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Linux操作系统】简学深悟启示录:进程状态&&优先级

本文介绍了Linux系统中进程的主要状态及其转换机制,重点分析了7种进程状态:运行态(R)、阻塞态(S/D)、挂起态(T/t)、终止态(X)和僵尸态(Z)。其中深度睡眠态(D)是系统崩溃的预警信号,而僵尸进程(Z)会导致内存泄漏问题。文章还阐述了进程优先级(PRI/NI)的查看和修改方法,揭示了基于位图哈希表的调度机制,以及进程竞争性、独立性等特性。最后解释了并行与并发的区别,并强调了进程上下文数据在切换时的重要性。

Zero_VPN的博客 2537

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Linux操作系统】简学深悟启示录:文件fd

本文回顾了文件系统的基本概念和C语言文件操作接口。首先解释了文件的组成(内容+属性)和两种状态(打开/未打开),重点分析了打开文件与进程的关系。接着通过代码示例演示了fopen、fwrite等C文件函数的使用,以及如何修改默认文件路径。文章还介绍了标准输入输出流(stdin/stdout/stderr)及其文件描述符(0/1/2)。随后详细讲解了系统调用open和write函数的使用方法,包括flags参数的各种选项组合原理。最后深入探讨了文件描述符的本质,指出它是进程文件描述符表中的索引,并解释了FILE

Zero_VPN的博客 3808

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【Linux操作系统】简学深悟启示录:环境变量&&进程地址

本文主要介绍了Linux环境变量和进程地址空间的概念。环境变量包括PATH、HOME等系统预定义变量,可通过env命令查看或getenv()函数获取,具有全局性,子进程会继承父进程的环境变量。进程地址空间是虚拟地址而非物理地址,通过页表映射到物理内存,实现进程隔离和保护。地址空间包含代码区、数据区等划分,由mm_struct结构体管理。进程地址空间和页表的存在使进程管理和内存管理解耦,确保安全访问和资源隔离。

Zero_VPN的博客 2937

【Linux操作系统】简学深悟启示录:进程间通信

本文主要介绍了进程地址空间和进程间通信的相关知识。第一部分补充了进程地址空间的内容,解释了程序加载到内存前的逻辑地址分布、动态库的加载机制以及CPU执行指令的流程。第二部分重点讲解了匿名管道的原理和应用,包括管道的创建、单向通信特性、实现代码以及管道的5种属性,最后展示了管道在进程池中的应用实例。文章通过示意图和代码示例,系统性地阐述了操作系统如何管理进程地址空间以及进程间通过管道通信的具体实现方式。

Zero_VPN的博客 1670

【Linux操作系统】简学深悟启示录:Linux基本指令

本篇将开启Linux操作系统的全面学习,默认使用的是CentOS操作系统,使用Xshell进行远程登录服务器进行操作测试

Zero_VPN的博客 1777

【Linux操作系统】简学深悟启示录:信号

本文介绍了Linux系统中信号处理的基本概念和工作原理。 首先通过快递的比喻解释了信号处理的三个关键步骤:信号产生、信号保存和信号处理。进程能够识别和处理信号,可以选择默认处理、自定义处理或忽略信号。 文章详细区分了前台进程和后台进程,指出前台进程能接收用户输入而后台进程默默运行。介绍了通过signal函数自定义信号处理的方法。 讨论了信号的多种产生方式:键盘组合键、kill命令、系统调用(kill/raise/abort)、硬件异常和软件条件。其中重点分析了除零异常和管道读端关闭时触发的信号机制。 最后讲

Zero_VPN的博客 1332

【Linux操作系统】简学深悟启示录:Linux权限

Linux 权限是系统通过对文件 / 目录设置读(r)、写(w)、执行(x)权限,分别管控文件所有者、所属组及其他用户对其的访问操作,以保障系统安全

Zero_VPN的博客 2440

【Linux操作系统】简学深悟启示录:线程概念与控制

本文介绍了线程的基本概念和控制方法。线程作为轻量级进程,共享进程资源但拥有独立执行流,是操作系统的调度基本单位。文章详细讲解了线程与进程的区别,线程的创建、终止和等待操作,包括使用pthread_create创建线程、pthread_exit终止线程以及pthread_join等待线程回收资源。同时介绍了线程特有的ID、栈和寄存器等私有数据,以及共享的文件描述符等资源。通过对比用户态TID和内核态LWP,阐明了线程在用户态和内核态的不同表现形式。最后指出线程退出时返回值的内存管理注意事项,强调线程控制的关键

Zero_VPN的博客 2万+

【Linux操作系统】简学深悟启示录:重定向&&缓冲区

本文主要探讨了Linux系统中的文件重定向和缓冲区机制。在重定向部分,通过代码示例演示了文件描述符分配规则及dup/dup2函数实现原理,解释了输出重定向的本质。同时介绍了多文件重定向的操作方法,包括分离输出和合并输出到同一文件。 缓冲区部分通过三组实验对比分析:1)仅含换行符时缓冲区正常刷新;2)无换行符且关闭文件描述符时,C接口函数内容无法刷新;3)存在换行符且调用fork时,父子进程共享缓冲区导致重复输出。最后总结了三种缓冲区类型:无缓冲、行缓冲和全缓冲的特性及其应用场景。文章还从VFS层面对&quo

Zero_VPN的博客 4066

【Linux操作系统】简学深悟启示录:动静态库

本文首先补充了文件系统的相关知识,包括内存与硬盘以4KB为单位交互数据的设计原理、系统通过页框数组管理内存的机制,以及文件读写过程中涉及的inode、dentry和address_space等关键数据结构。然后重点讲解了动静态库的创建和使用方法:通过具体示例演示了如何制作静态库(libmymath.a)和动态库(libmymethod.so),详细说明了编译命令中的-I、-L、-l等参数含义,并针对动态库使用时常见的加载问题提供了四种解决方案。文章通过代码示例和流程图相结合的方式,清晰地展现了文件系统管理和

Zero_VPN的博客 1663

【Linux操作系统】简学深悟启示录:Linux环境基础开发工具使用

本文介绍了Linux系统下的三大核心工具:软件包管理器yum、编辑器vim和编译器gcc/g++。yum作为常用的软件包管理工具,能自动解决依赖关系,简化安装过程,文章详细说明了yum的安装、删除等基本操作。vim编辑器部分重点讲解了其三种主要模式(命令模式、插入模式和底行模式)的切换及常用操作命令,包括移动光标、复制粘贴、查找替换等技巧。gcc/g++编译器部分则系统阐述了程序的四个编译阶段:预处理、编译、汇编和链接,并给出了每个阶段的具体命令示例。这些工具是Linux系统下进行软件开发的基础

Zero_VPN的博客 2578

【Linux操作系统】简学深悟启示录:线程同步与互斥

本文展示了一个多线程抢票系统的实现,通过模拟5个线程并发访问共享变量tickets=1000,揭示了多线程环境下数据竞争的问题。文章详细分析了线程互斥的概念,包括临界资源、临界区和互斥锁的使用方法。通过引入pthread_mutex_t互斥锁机制,解决了数据混乱问题,保证了线程安全。同时探讨了互斥锁的原理,解释了CPU通过swap/exchange指令实现原子操作的过程,以及单核CPU环境下线程通过上下文切换实现逻辑隔离的机制。最后指出互斥锁虽然解决了数据竞争,但可能引发线程饥饿问题,需要合理设计锁的使用策

Zero_VPN的博客 1万+
上一篇: 【Linux操作系统】简学深悟启示录:Linux环境基础开发工具使用
下一篇: 【Linux操作系统】简学深悟启示录:进程状态&&优先级
澪贰
澪贰 优质创作者: C/C++技术领域 优质创作者: C/C++技术领域
博客等级 码龄2年 1万+粉丝 222原创
评论 53
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值