Window/.Net程序员如何用最简单的方式掌握Linux的本质

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

from:http://www.cnblogs.com/frand/archive/2010/12/27/1918371.html

“If you can't explain it simply, you don't understand it well enough”
                                                       Albert Einstein 
  有很多关于Linux的书籍,博客。大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多人望而却步。未入其门就路过了。
  所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语言来介绍Linux背景和动机。 就如同所有的的网络游戏都要先介绍游戏的历史观,然后再介绍游戏的操作。
  大多数初学者在刚刚接触Linux都会有非常陌生的感觉。往往会有一些疑惑和问题。而我们就沿着这些问题,从远及近,从宏观到微观来理解Linux的简洁和美丽。
 
  问题1: Winows有注册表,为什么Linux没有注册表
   注册表是Windows核心组件,对整个系统进行配置。Linux是以整个文件系统作为"注册表“,Windows注册表的树形结构,可以粗略的对应Linux文件系统的树形结构。
   Linux的配置文件就相当于注册表的键,或者说Linux采用是的分布式的注册表。
   那么Linux为什么要这样设计呢?因为Linux是所谓的网络操作系统,所以单台电脑不是Linux的界限,如果是多台电脑组成的系统,那么分布式的管理就有着巨大的优势。
   例如:一个包含配置文件的磁盘的损害不会让整个系统瘫痪,而可能只是让部分功能失效。

  问题2:Windows有完善的图形界面,而Linux为什么要学命令行。
  首先,命令行绝对要比图形界面先进的多。命令行是程序员的第一界面,而图形界面是普通用户的第一界面。
  也许很多人会有不同意见,其实我们再向前想一步,就很清楚了。
  命令行的下一步演化是什么? 很简单就是语音控制,就是把人类自然语言转化为命令
  图形界面的的下一步演化是什么? 是姿势控制。从目前的Windows系统来说一共只有3种姿势, 单击,双击,拖放。而更先进的IPad有拨动,画圈等。
  姿势控制很简单,便于用户上手,语音控制很复杂,但是控制精度很高。
  作为程序员我们要求电脑完成的工作要比普通用户复杂的多,所以使用命令行会非常高效。
  退一步讲,图形界面本质也是命令行,只不过将姿势翻译成命令执行而已。
  程序员编程的代码也都是“命令行”,一条一条的指令而已。
  总之,只要能打破对Linux命令行的恐惧感,接下来的事就会非常容易了。这个命令行绝对不是你简单想像中的命令行,它是非常智能化的。

  问题3:Linux有那么多目录,那么多命令,怎么记得住呢?
  首先,Linux目录是Linux系统最灵魂的东西,所有的硬件都可以被抽象为文件,从而实现网络化。(Internet只不过是Unix/Linux的进一步的演化而已)
  所以只要掌握了Linux目录的规律,在理解的基础上记忆就可以容易的多。另外Linux的命令行有智能化功能,可以让你少打95%以上的字符来完成命令。
  绝非你所想象的傻乎乎的敲一大堆命令,那些用Linux大牛都是绝顶聪明的人,怎么可能让自己辛苦呢?

  问题4:Linux的文件夹结构看上去很复杂,怎么理解呢?
  我们这里假设,我们就是设计者,如果我们设计一个文件系统,我们会如何去做呢?
  我们需要一个起点, 这个起点就叫根目录,用“/”来表示,然后我们需要启动Linux,那么我们就会把所有核心的启动文件(包括Linux核心本身)都放到一个“/boot"目录下。
  当系统启动后,我们需要执行一些基本命令在操作系统,这些命令都会放到“/bin"目录下。然后这些命令可能会用到一些库,这些库就被放到“/lib"下面,而这些库可能会会用到一些设备驱动文件, 
  那么这些驱动文件就会放到“/dev"目录下。
  /:根目录
  /boot:系统启动和内核
  /bin :系统基本命令  (bin是binary的缩写)
  /lib : 系统库(不能直接运行的代码)(lib是libary的缩写)
  /dev : 设备驱动 (dev是device的缩写)
  到目前为止只用5个目录,很简单吧。
 

  问题5: 什么是"/usr" ,"/etc"和“/var“

  当用户启动系统以后,要做一些更加复杂的工作,这时候就会涉及到一个叫“/usr",这个情况稍微有些复杂,是一个难点。不过也很容易解释清楚。
  早期的unix系统都有很多块硬盘,当时硬盘的容量都很小, 所以往往一个硬盘只放一个目录,比如“/boot"可以放在一个单独的"boot"盘上,上面提到的5个目录,是系统运行必不可少的。
  而当系统启动以后,我们需要其他一些用于具体工作的程序时,我们就会加载一个“/usr"目录,上面放重要的运行程序。
  容易引起疑惑的是"usr"这个名字, 在历史上,原来这个确实是user的缩写,不过现在和user没有任何关系了, 你可以把它看成是"universal software resource"的缩写。
  这个“/usr"有点类似Windows里面的Program Files。
  因此 /bin 和 /usr/bin的区别,就是 /bin里面的程序更加核心  
  这时候,很多人会有疑问, 我们记住哪些命令在/bin 还是在/usr/bin呢?
  放心,由于所有的bin目录都会登记到系统变量PATH里面, 因此无论你在任何当前目录中,只要输入命令文件的名称,系统都会帮你找到这个命令并运行。
  要点:
  1,/usr上面一般都是只读文件,数据文件和配置文件不放在上面(放到哪里,后面会讲)
  2,没有“/usr",linux系统也能正常运行
  2,/usr可以被多台电脑共享(这里体现Linux系统的网络性)
  
  由于/usr只放只读文件,那么配置文件和数据文件放哪里呢?这里就出现了2个新的目录“/etc"和“/var"
  这里容易初学者迷惑的就是这个2个目录的名字。
  在历史上 "etc“是 “etcetera”,中文意为“其他”, 现在这个和“其他”没有任何关系, 就是专门存放配置文件的地方,可以理解为“editable text configuration"的缩写
  比如 /etc/mysql就是放mysql的配置文件 /ect/apache2/就是apache2的配置文件
  在历史上“var" 是 “variable",中文意为“变动”,现在主要用来存放log,lock等文件。
  例如 /var/mysql就是用来存放mysql的log
 

问题6:用户自己产生的数据放到哪里?

  当我们运行程序后,会产生很多自己的成果,这些成果放哪里呢? 这里就出现了一个“/home"目录,不过你不能直接放到“/home"目录下, 因为Linux是个多用户操作系统, 所以系统会有一个以用户的名字命名的目录。
  例如:用户是jack ,那么目录就是/home/jack ,这个目录也可以用“~“来表示。
   

  至此,我们也就基本了解了Linux的组成。

补充: Linux分为kernel和shell两部分,也就是内核和外部接口,ubuntu用的是bash shell.


.NET Core 文件路径解决方法,统一Linux Window .NET Core 文件路径解决方法,统一Linux Window.NET Core 文件路径解决方法,统一Linux Window1 场景2 平台文件路径处理方式3 解决方案上传解压ZipFile解压ZipFile源码修改修改方案 .NET Core 文件路径解决方法,统一Linux Window 在不同平台下面,这里特指LinuxWindow,一般我们开发机在window下面,而生产环境在linux平台下,而两个平台处理文件路径不同,稍不注意就会掉坑中。 1 场景 1.1. 上传文件 2.2. 压缩包 阅读详情

相关推荐

Electron.NET开发入门(Linux && Windows)

先决条件 使用Electron.NET进行开发,不论是在Windows系统下,还是在Linux系统下,确保计算机已安装: Node.js NPM dotnet CLI Electron.NET 全局工具: ElectronNET.CLI .NET 5.0以上的SDK Windows系统下环境搭建 操作系统及IDE Windows 7及以上,X86/X64架构的即可。 IDE使用的是 Visual Studio 2019 安装步骤 Node.js及npm的安装 下载地址 选择与自己电脑对应的(32位/64

军火库 4153

操作系统,Linux面试题

通过面试积累 。

[Asp.Net Core]NET5跨平台的本质

NET5跨平台的本质 1.Web应用程序是一个控制台;—Main程序的入口;跨平台的原因在于框架已经内置了主机,只要是 程序启动,就是启动了主机,就可以监听端口;请求来了,只要是请求这个端口,主机就可以响应;无 论是在Windows还是在Linux下开发,都是要第一步完成环境的;这样就不用拘泥于是在Windows还是 在linux,----这就是能够跨平台的本质原因; 新的改变 public static void Main(string[] args) {

德仔 457

清华大学Linux操作系统原理与应用

第1章 操作系统概述 1 1.1 认识操作系统 1 1.1.1 从使用者角度 1 1.1.2 从程序开发者角度 2 1.1.3 从操作系统在整个计算机系统中所处位置 2 1.1.4 从操作系统设计者的角度 3 1.2 操作系统的发展 4 1.2.1 操作系统的演变 4 1.2.2 硬件的发展轨迹 5 1.2.3 软件的轨迹 6 1.2.4 单内核与微内核操作系统 7 1.3 开放源代码的Unix/Linux操作系统 8 1.3.1 Unix的诞生和发展 8 1.3.2 Linux的诞生 9 1.3.3 操作系统标准POSIX 9 1.3.4 GNU和Linux 9 1.3.5 Linux的开发模式 10 1.4 Linux内核 10 1.4.1 Linux内核的位置 10 1.4.2 Linux内核的作用 11 1.4.3 Linux内核子系统 11 1.5 Linux内核源代码 13 1.5.1 多版本的内核源代码 13 1.5.2 Linux内核源代码的结构 13 1.5.3 Linux内核源代码分析工具 14 习题1 15 第2章 内存寻址 17 2.1 内存寻址简介 17 2.1.1 Intel x86 CPU寻址方式的演变 18 2.1.2 IA32寄存器简介 19 2.1.3 物理地址、虚拟地址及线性地址 21 2.2 分段机制 22 2.2.1 地址转换及保护 24 2.2.2 Linux中的段 24 2.3 分页机制 25 2.3.1 页与页表 25 2.3.2 线性地址到物理地址的转换 28 2.3.3 分页示例 28 2.3.4 页面高速缓存(cache) 29 2.3.5 Linux中的分页机制 30 2.4 Linux中的汇编语言 31 2.4.1 AT&T与Intel汇编语言的比较 31 2.4.2 AT&T汇编语言的相关知识 32 2.5 Linux系统地址映射示例 33 习题2 35 第3章 进程 37 3.1 进程介绍 37 3.1.1 程序和进程 37 3.1.2 进程的层次结构 38 3.1.3 进程状态 39 3.1.4 进程实例 40 3.2 进程控制块 41 3.2.1 进程状态 42 3.2.2 进程标识符 43 3.2.3 进程之间的亲属关系 43 3.2.4 进程控制块的存放 44 3.3 进程的组织方式 45 3.3.1 进程链表 45 3.3.2 散列表 46 3.3.3 可运行队列 47 3.3.4 等待队列 47 3.4 进程调度 48 3.4.1 基本原理 48 3.4.2 时间片 50 3.4.3 Linux进程调度时机 50 3.4.4 进程调度的依据 51 3.4.5 调度函数schedule()的实现 52 3.5 进程的创建 54 3.5.1 创建进程 55 3.5.2 线程及其创建 56 3.6 与进程相关的系统调用及其应用 58 3.6.1 fork系统调用 58 3.6.2 exec系统调用 59 3.6.3 wait系统调用 60 3.6.4 exit系统调用 62 3.6.5 进程的一生 63 3.7 与调度相关的系统调用及应用 63 习题3 65 第4章 内存管理 67 4.1 Linux的内存管理概述 67 4.1.1 虚拟内存、内核空间和用户空间 67 4.1.2 虚拟内存实现机制间的关系 69 4.2 进程用户空间的管理 70 4.2.1 进程用户空间的描述 71 4.2.2 进程用户空间的创建 74 4.2.3 虚存映射 76 4.2.4 进程的虚存区示例 76 4.2.5 与用户空间相关的系统调用 78 4.3 请页机制 79 4.3.1 缺页异常处理程序 79 4.3.2 请求调页 81 4.3.3 写时复制 83 4.4 物理内存的分配与回收 83 4.4.1 伙伴算法 85 4.4.2 物理页面的分配 86 4.4.3 物理页面的回收 88 4.4.4 slab分配模式 89 4.4.5 内核空间非连续内存区的分配 93 4.5 交换机制 95 4.5.1 交换的基本原理 95 4.5.2 页面交换守护进程kswapd 99 4.6 内存管理实例 99 4.6.1 相关背景知识 100 4.6.2 代码体系结构介绍 100 4.6.3 实现步骤 103 4.6.4 程序代码 103 习题4 108 第5章 中断和异常 110 5.1 中断的基本知识 110 5.1.1 中断向量 110 5.1.2 外设可屏蔽中断 111 5.1.3 异常及非屏蔽中断 112 5.1.4 中断描述符表 112 5.1.5 相关汇编指令 113 5.2 中断描述符表的初始化 114 5.2.1 IDT表项的设置 114 5.2.2 对陷阱门和系统门的初始化 115 5.2.3 中断门的设置 116 5.3 中断处理 116 5.3.1 中断和异常的硬件处理 116 5.3.2 中断请求队列的建立 117 5.3.3 中断处理程序的执行 119 5.3.4 从中断返回 121 5.4 中断的下半部处理机制 121 5.4.1 为什么把中断分为两部分来处理 122 5.4.2 小任务机制 122 5.4.3 下半部 124 5.4.4 任务队列 125 5.5 中断应用——时钟中断 125 5.5.1 时钟 125 5.5.2 时钟运作机制 126 5.5.3 Linux的时间系统 127 5.5.4 时钟中断处理程序 128 5.5.5 时钟中断的下半部处理 129 5.5.6 定时器及其应用 129 习题5 132 第6章 系统调用 133 6.1 系统调用与应用编程接口、系统命令、内核函数的关系 133 6.1.1 系统调用与API 133 6.1.2 系统调用与系统命令 134 6.1.3 系统调用与内核函数 134 6.2 系统调用处理程序及服务例程 135 6.2.1 初始化系统调用 136 6.2.2 system_call()函数 136 6.2.3 参数传递 137 6.2.4 跟踪系统调用的执行 139 6.3 封装例程 140 6.4 添加新系统调用 141 6.5 实例——利用系统调用实现一个调用日志收集系统 143 6.5.1 代码体系结构 143 6.5.2 把代码集成到内核中 146 6.5.3 实现步骤 148 习题6 148 第7章 内核中的同步 149 7.1 临界区和竞争状态 149 7.1.1 临界区举例 149 7.1.2 共享队列和加锁 150 7.1.3 确定保护对象 151 7.1.4 死锁 152 7.1.5 并发执行的原因 153 7.2 内核同步方法 153 7.2.1 原子操作 153 7.2.2 自旋锁 155 7.2.3 信号量 156 7.3 并发控制实例 157 7.3.1 内核任务及其并发关系 158 7.3.2 实现机制 158 7.3.3 关键代码解释 162 7.3.4 实现步骤 163 习题7 164 第8章 文件系统 165 8.1 Linux文件系统基础 165 8.1.1 Linux文件结构 165 8.1.2 Linux文件系统 166 8.1.3 文件类型 167 8.1.4 文件访问权限 168 8.2 虚拟文件系统 168 8.2.1 虚拟文件系统的引入 168 8.2.2 VFS中的数据结构 170 8.2.3 VFS超级块数据结构 171 8.2.4 VFS的索引节点 173 8.2.5 目录项对象 174 8.2.6 与进程相关的文件结构 176 8.2.7 主要的数据结构之间的关系 179 8.3 文件系统的注册、安装与卸载 180 8.3.1 文件系统的注册和注销 180 8.3.2 文件系统的安装 181 8.3.3 文件系统的卸载 183 8.4 页缓冲区 183 8.4.1 address_space对象 183 8.4.2 address_space对象的操作函数表 184 8.5 文件的打开与读写 185 8.5.1 打开文件 185 8.5.2 读写文件 187 8.6 编写一个文件系统 189 8.6.1 Linux文件系统的实现要素 189 8.6.2 什么是romfs文件系统 191 8.6.3 romfs文件系统的布局与文件结构 191 8.6.4 具体实现的对象 192 习题8 195 第9章 设备驱动 196 9.1 概述 196 9.2 设备驱动程序基础 198 9.2.1 I/O端口 199 9.2.2 设备文件 200 9.2.3 中断处理 201 9.2.4 设备驱动程序框架 203 9.3 字符设备驱动程序 204 9.3.1 字符设备驱动程序的注册 204 9.3.2 简单的字符设备驱动程序示例 205 9.4 块设备驱动程序 208 9.4.1 块设备驱动程序的注册 209 9.4.2 块设备请求 212 习题9 215 附录A 内核中的链表 216 A.1 链表数据结构简介 216 A.2 内核链表数据结构的定义及初始化 217 A.3 操作链表的接口 218 A.4 遍历链表 219 附录B 内核模块 221 B.1 什么是模块 221 B.2 编写一个简单的模块 221 B.3 模块编程的基础知识 222 B.4 模块的编译 224 B.5 模块实用程序modutils 226 附录C Linux内核编译 228 C.1 内核简介 228 C.2 为什么重新编译内核 228 C.3 内核编译模式 229 C.4 新版本内核的获取和更新 229 C.5 内核编译 230 C.6 修改并重启管理器 232 附录D Linux编程基础(C语言环境) 233 D.1 Linux编程常识 233 D.1.1 相关标准(ANSI C、POSIX、SVID、XPG) 233 D.1.2 函数库和系统调用 234 D.1.3 在线文档(man、info、HOWTO) 235 D.1.4 C语言编程风格 237 D.2 Linux上的C/C++编译器和调试器 238 D.2.1 运行gcc/egcs 238 D.2.2 gcc/egcs的主要选项 240 D.2.3 gdb简介 240 D.2.4 gdb的常用命令 241 D.2.5 gdb使用示例 242 D.3 GNU make和makefile 243 D.3.1 GNU make 243 D.3.2 makefile的基本结构 243 D.3.3 makefile的变量 244 D.3.4 GNU make的主要预定义变量 245 D.3.5 GNU make的隐含规则 245 D.3.6 运行make 246

哪种Linux发行版适合程序员做开发?

点击查看全文 提起linux身为程序员一定不会陌生,Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。是一个性能稳定的多用户网络操作系统。主要用途在服务器领域。 那么Linux的好处到底在哪里呢? 由于各种优势的存在,linux的普及程度很高,不少普通用户也加入了li

DONGYUXIA15810857916的博客 2万+

学习Linux最简单的方法

大多数初学者在刚刚接触Linux都会有非常陌生的感觉。往往会有一些疑惑和问题。而我们就沿着这些问题,从远及近,从宏观到微观来理解Linux的简洁和美丽。   问题1:Winows有注册表,为什么Linux没有注册表?   注册表是Windows核心组件,对整个系统进行配置。Linux是以整个文件系统作为“注册表”,Windows注册表的树形结构,可以粗略的对应Linux文件系统的树形结构。 ...

weixin_30814223的博客 117

中国Linux程序员生存现状

程序员》记者/闫辉 Linux,在很多人看来,是一个既熟悉又陌生的名词,好像时时在我们的周围,但又抓不到它真实的一面。在我们的印象中,Linux同着网络经济的泡沫息息相关。随着网络经济的江河日下,Linux的声音也低沉了下来,只是偶尔挥动几下手臂,便又消失的无影无踪。不过,当我们为C#还是Java谁更有前途争论的不亦乐乎的时候,希望视线中不要忽视还有一批在Linux上做开发和研究的程序员。虽然相

创业算法 6149

.net程序部署Linux运行

目前,我所尝试的只有.net8.0及以上才可部署Linux,所以着重讲.net8.0部署Linux;升级.net472项目步骤,经验分享!-CSDN博客。

2301_76830515的博客 1107

window电脑安装Linux系统

身为小白的我们在安装Linux系统时会遇到很多麻烦,没有接触过的命令,没有实际操作的经验,觉得Linux遥不可及,这篇博客讲述了我安装Linux的经历与安装过程遇到的问题与解决方案。我是为了学习Linux开发而安装,目的不同安装方式不同大家自行选择。安装Linux一共有三种方式:虚拟机安装,Windows子系统Linux,U盘镜像安装Linux。这篇博客为你带来的是Windows子系统Linux。对于小白来讲这个方式是十分友好的,这种安装方式既不会影响我们windws与Linux共存还可以方便共享文件。

weixin_49038319的博客 7052

使用MONO移植ASP.NET 编写的Window服务到Linux

目的:使用mono将ASP.NET编写的Window服务移植到Linux下运行 使用的软件:mono2.0, Linux Red hat 步骤: 1、在Window下编写一个Remoting服务端作为Window服务。包括   RemoteServer.exe(服务运行文件) RemoteServer.exe.config(配置文件) 将这两个文件放到Linux系统的一个目录...

a369488983的博客 254

.net core读取文件内容(linux+window)

操作环境.net 5centos7vistual studio 2019(16.11.15)win10.net core和.net framework的写法是一样的代码如下: 程序使用相对路径的方式window平台下的运行结果linux平台下的执行结果:把Debug目录下的net5.0目录拷贝到centos7的目录下执行,执行结果如下图:...

zxy13826134783的博客 2196

Linux 无边框窗口原理:PyQt-Frameless-Window 的 X11 实现深度解析

**Linux 无边框窗口**怎么做才不卡顿、不丢系统级交互?PyQt-Frameless-Window 给出的答案是:在 X11 环境下,把"移动"和"缩放"这两件最棘手的事交还给窗口管理器(Window Manager),而自己只负责判断鼠标位置、发出正确的协议消息。本文将从 X11 协议层面拆解它的完整实现思路,并带你读懂 [linux_utils.py](https://link.gitc

gitblog_00094的博客 289

window下的DOS命令及Linux命令

操作系统常用命令集

weixin_40220242的博客 1420

.net程序如何打开 linux,如何在c# .NET中編寫程序,在Linux/Wine/Mono上運行它們?

In this particular case I need to run .complicated NET application for Linux. By complicated i mean - that project was developed for 3 years and i don't want to write it again in java or something els...

weixin_33736386的博客 304

.net core的一种兼容Docker,k8s,LinuxWindow的获取环境变量的方式

详情请参考:.net core的一种兼容Docker,k8s,LinuxWindow的获取环境变量的方式http://config.net.cn/teamproject/pms/e3dd3ead-1910-4143-9efa-b894cec96c39-p1.html

key12315的专栏 436

linux .net跨平台,简单谈谈.NET Core跨平台开发

对于.NET开源计划想必关注的人已经跃跃欲试了,但是真正将其用于开发的目前来说不多。毕竟截至本文发布时.NET Core才发布到1.0RC2版本。正式版预计还有一段时间。况且大多数人都是持观望态度,就算开发仍然用的还是.NET Framework。另外不得不说的一点就是.NET开源的进度很惊人但是社区建设还有待提升,很多配套的东西还不齐全。Java在语言层级上可能落后.NET但是Java的社区力量...

weixin_30884743的博客 795

什么是.NET?什么是.NET Core?.NET.NET Core区别又是什么呢?

本文首发于码友网–《什么是.NET?什么是.NET Core?.NET.NET Core区别又是什么呢?》 概述 对于.NET平台的初学者来说,有时候比较困惑“什么是.NET?什么是.NET Core?.NET.NET Core区别又是什么呢?”。确实,目前微软的开发平台有两种不同的.NET运行时环境,一种是.NET Framework,另一种则是.NET Core(.NET 5),不同的目标框架运行时环境不同。 那这两者的区别到底是什么,在开发时如何选择不同的.NET框架呢?本文将为.NET开发者逐一

码友网官方博客 1万+

Linux搭建aspx教程,10分钟学会在Windows/Linux下设置ASP.Net Core开发环境并部署应用

创建和开发ASP.NET Core应用可以有二种方式最简单方式是通过Visual Studio 2017 来创建,其优点是简单方便,但需要安装最新版本Visual Studio 2017 preview 15.3 。另一种方式是使用Visual Studio Code来创建,Visual Studio Code 则是一款轻量级的编辑器 ,可在多种操作系统中运行,如果情况允许,笔者更建议使用Vi...

weixin_36424625的博客 1534
上一篇: 计算机发展历史上很有名的两个口号
下一篇: ubuntu最常用命令总结(3)
mypods
博客等级 码龄13年 5粉丝 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值