自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(117)
  • 收藏
  • 关注

原创 【Linux庖丁解牛】—系统文件I/O !

前面我们知道文件描述符是一个一个的整型,我们看到0 1 2 3 这样的字样,在计算机中首先想到的就是数组!在计算机中,可能会同时打开成千上万的文件,后者说有哪些文件即将被打开,哪些文件即将被关闭......那系统是如何维护这些信息呢?很简单,先描述再组织!所以在内核数据结构中有一种结构体struct file记录这些被打开的文件信息!这些文件以双向链表的形式链接起来。我们知道用户访问文件时,实际上就是进程在访问文件!一个进程可能打开多个文件,所以,进程是如何管理自己打开的进程呢!

2025-06-07 16:06:55 460 1

原创 【Linux庖丁解牛】—自定义shell的编写!

在我们使用系统提供的shell时,每次都会打印出一行字符串,这其实就是命令行提示符,那我们自定义的shell当然也需要这一行字符串。这一行字符串包含用户名,主机名,当前工作路径,所以,我们在打印这行字符串时,需要获取这些信息。根据我们之前学过的知识,我们可以用getenv系统调用来获取!这里有一个接口gethostname,我试过了用getenv来获取系统的主机名,但是,在我的系统上似乎无法获取,这可能和系统有关,但是我们用gethostname这个接口也可以很安全的获得主机名,具体用法用man手册看一看也

2025-06-04 16:42:22 703

原创 【Linux庖换现象丁解牛】—进程程序替换!

既然如此,那我们也必须注意到一点,进程程序替换并没有创建一个新的进程,而只是改变了原进程中的代码,代码可能会更多,对应的地址映射可能也会发生改变,但这些我们并不关心。它的第一个参数就是路径,第二个参数是程序名称,我们注意到后面的三个...,在C语言中我们就知道这是可变参数【这部分参数的填写原则就是:指令怎么敲,参数怎么填】,不过,我们要最后填写一个NULL参数表明参数填写完毕!实验和我们预期的一样,但是,如果我们想新增环境变量,保留原来的,我们要如何办到呢?程序,能不能替换我们自己写的程序呢!

2025-05-21 16:16:41 791 1

原创 【Linux庖丁解牛】——进程等待!

稍微修改一下代码,做一个实验:手动杀掉进程!父进程得到相应的退出信号!我们可以通过指令kill -l来查找所有的信号:这里只是简单的见了见信号,具体细节还没有说!

2025-05-20 08:40:12 941 1

原创 【Linux庖丁解牛】—程序地址空间【进程地址空间 | 虚拟地址空间】

每个进程都有一个虚拟地址空间,为了管理这些虚拟地址空间,在操作系统中势必会有某种数据结构将这些虚拟地址空间管理起来。这里就直接说了,在Linux中,某个进程的虚拟地址空间用mm_struct的结构体描述,在进程的task_struct中有一个指向mm_struct结构体的指针。/*...*///对于普通的⽤⼾进程来说该字段指向他的虚拟地址空间的⽤⼾空间部分,对于内核线程来说这部分为NULL。// 该字段是内核线程使⽤的。当该。

2025-05-07 18:43:37 887 2

原创 【Linux庖丁解牛】—环境变量!

• 环境变量(environment variables)⼀般是指在操作系统中用来指定操作系统运行环境的⼀些参数• 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪 里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。• 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性1.2 命令行参数。

2025-04-30 12:22:34 1250 1

原创 【Linux庖丁解牛】—进程优先级!

目标资源稀缺导致要通过优先级确认谁先谁后的问题。优先级:可以得到某种资源,先后问题。权限:能否得到某种资源的问题。。进程的优先级本质上也是一种数字(int类型),在task_struct中。。进程优先级值越高,优先级越低,值越低,优先级越高。。目前我们接触到的操作系统大多都是基于时间片的分时操作系统。时间片我们可以理解为每个进程在cup中运行一次的规定时间,无论该进程的代码和数据是否执行完毕,该进程都会从cup中剥离下来等待下一次被调度。【至于操作系统是如何完成的,下面会详细说到】

2025-04-25 14:39:42 919 1

原创 【Linux庖丁解牛】—切换和调度!

在比较老的内核版本中,其数据其实就是在进程结构体对象task_struct【tss】中。参考⼀下Linux内核0.11代码但是,在当代计算机中,数据并不是在task_struct中,而是由一个指针【在task_struct】指向另一个结构体对象【该结构体对象里面保留着当前进程的硬件上下文数据】,这样做的目的是减少结构体的大小,从而加快进程的创建!

2025-04-24 08:41:47 275

原创 【Linux庖丁解牛】—Linux第一个系统程序—进度条!

在实现进度条之前,这里我们要先铺垫两个概念——回车换行与行缓冲区。

2024-12-24 17:40:20 2200 68

原创 【Linux庖丁解牛】—gcc/g++&make/Makefile!

在我们的实际开发中,不可能将所有代码放在⼀个源⽂件中,所以会出现多个源⽂件,⽽且多个源⽂件之间不是独⽴的,⽽会存在多种依赖关系,如⼀个源⽂件可能要调⽤另⼀个源⽂件中定义的函数,但是每个源⽂件都是独⽴编译的,即每个*.c⽂件会形成⼀个*.o⽂件,为了满⾜前⾯说的依赖关系,则需要将这些源⽂件产⽣的⽬标⽂件进⾏链接,从⽽形成⼀个可以执⾏的程序。它的主要功能是确定文件的类型。上面说到过make的好处就是让我们的工程编译更加的方便,但是到目前为止,我们并没有看到make命令让我们的编译更加方便,甚至还更加复杂了。

2024-12-16 21:36:57 1309 12

原创 【优选算法】——分治-快速&归并排序!

交易中的逆序对为 (9, 7), (9, 5), (9, 4), (9, 6), (7, 5), (7, 4), (7, 6), (5, 4)。在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。必须在不使用库内置的 sort 函数的情况下解决这个问题。你需要返回给定数组中的重要翻转对的数量。请注意,你需要找的是数组排序后的第。,返回其中存在的「交易逆序对」总数。的情况下解决问题,时间复杂度为。

2024-12-12 22:15:14 2077 68

原创 【优选算法】——模拟!

该示例共有 25 种解决方案,从 "azs" 到 "yzs" 都是符合题目要求的。只有 "z" 是无效的修改,因为字符串 "zzs" 中有连续重复的两个 'z'。可以证明,在给定的约束条件下,答案总是存在的。- 第 2 秒,提莫再次攻击艾希,并重置中毒计时器,艾希中毒状态需要持续 2 秒,即第 2 秒和第 3 秒。中毒状态会维持 2 秒,即第 1 秒和第 2 秒。中毒状态会维持 2 秒,即第 1 秒和第 2 秒。- 第 4 秒,提莫再次攻击艾希,艾希中毒状态又持续 2 秒,即第 4 秒和第 5 秒。

2024-11-27 16:27:22 1012 20

原创 【Linux庖丁解牛】—软件安装&vim!

在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系.yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora,

2024-11-19 20:31:29 2434 77

原创 【Linux庖丁解牛】—权限!

你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提 亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫 它王婆,它对应我们常使用的bash。,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的 操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)究其原因,也就是在我的目录里面的所有文件我都有删除和新建的权限(即使这个文件我不能读,不能写),因为我对于这个目录有w权限!

2024-11-17 16:04:02 2112 82

原创 【Linux庖丁解牛】—Linux基本指令(下)!

a或–all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类 型,硬件平台类型,操作系统名称。我们之前可以使用cat指令打印日志文件中的所有内容,现在我们也可以使用管道配合grep指令过滤出我们想要的内容!如果我们想要在本地上传压缩包到云服务器,那我们就可以使用rz指令,方便的话,我们也可以直接使用拖拽的方式上传!打包可以防止文件丢失,压缩可以减少体积,节省存储空间,可以减少网络传送的时间!,其作用是在指定的文件中过滤出包含你指定字符串的内容,并按行打印出来。

2024-11-16 14:44:59 2400 79

原创 C++从入门到起飞之——开放定址法实现哈希表 全方位剖析!

我们定义一个HashTable对象,那么我们就可以复用insert逻辑进行新表和旧表的重新映射,因为在复用insert逻辑之前,我们已经进行了2倍扩容,所以insert决不会循环进入扩容逻辑,只会走插入逻辑!我们的Hash映射都是通过无符号整形来确定key在表中的位置,但是,如果外层的key类型并不是无符号整形如string,浮点数,甚至是负数时,上面代码的逻辑就有大问题了!C++标准中设计了一个获取素数的函数,扩容时,我们只需要将当前表的大小传给这个函数,我们就能获取到接近2倍的素数!

2024-11-06 12:43:59 1540 39

原创 【优选算法】——前缀和!

左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0。请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和,接下来q行,每行4个整数x1, y1, x2, y2,分别代表这次查询的参数。接下来有q次查询, 每次查询有两个参数l, r.

2024-11-04 17:18:08 951 75

原创 【优选算法】——二分查找!

给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。示例 1:nums = [[3,4]示例 2:nums = [[-1,-1]示例 3:[-1,-1]public://处理边界情况//求左端点while(left

2024-10-31 08:41:36 2013 60

原创 C++从入门到起飞之——红黑树封装map和set 全方位剖析!

我们在使用[]时,如果map中有和我们外面传递的key相同的key,那insert就会插入失败并且返回这个key的迭代器。map和set迭代器的实现其实思路与list迭代器的实现几乎一样,它们都是由一个一个的节点组成的。如果当前节点的右为空,则说明当前节点的中序已近完毕,如果当前节点是父亲的右,说明父亲的中序也完毕,所以我们要找到祖先节点中是父亲的左的那个节点,那++后的节点就是就是父亲。无论是set还是map的查找都是根据key来进行的,所以我们的红黑树类模版的第一个参数类型是接受上层传递过来的K类型。

2024-10-27 11:21:34 1533 81

原创 【优选算法】——滑动窗口(下篇)!

它是 words 中以 ["the","foo","bar"] 顺序排列的连接。它是 words 中以 ["foo","bar","the"] 顺序排列的连接。它是 words 中以 ["bar","the","foo"] 顺序排列的连接。它是 words 中以 ["bar","foo"] 顺序排列的连接。起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

2024-10-25 13:25:20 2801 69

原创 【优选算法】——滑动窗口(上篇)!

3、那我们就更换固定点left,那这时候right也没有必要傻乎乎的回到固定点重新枚举。2、当我们固定一端left,用right去枚举时,当right恰好走到大于等于target的位置。这时候right其实就没有必要继续往后走了,因为后面的长度都大于此时的长度!1、我们首先想到的一定是暴力枚举所有的子数组,记录最小的长度即可解决问题。粗体数字从 0 翻转到 1,最长的子数组长度为 10。粗体数字从 0 翻转到 1,最长的子数组长度为 6。请注意,你的答案必须是。是该条件下的长度最小的子数组。

2024-10-21 22:26:06 1239 88

原创 C++从入门到起飞之——红黑树 全方位剖析!

c变成课这颗树新的根,这样⼦树⿊⾊结点的数量不变,没有连续的红⾊结点了,且 不需要往上更新,因为c的⽗亲是⿊⾊还是红⾊或者空都不违反规则。c变成课这颗树新的根,这样⼦树⿊⾊结点的数量不变,没有连续的红⾊结点了,且 不需要往上更新,因为c的⽗亲是⿊⾊还是红⾊或者空都不违反规则。c为红,p为红,g为⿊,u不存在或者u存在且为⿊,u不存在,则c⼀定是新增结点,u存在且为⿊,则 c⼀定不是新增,c之前是⿊⾊的,是在c的⼦树中插⼊,符合情况1,变⾊将c从⿊⾊变成红⾊,更新上 来的。,我们只需要进行变色。

2024-10-18 14:43:54 2047 73

原创 【优选算法】——双指针(下篇)!

b、如果大于,count+=(right-left ),固定max和right两边后,left是right之后最小的一边。2、排序后,我们定义target在len-1的位置,left=0,right=target-1。1、 暴力解法:我们可以很轻松的想到枚举所有的三条变,判断它们是否可以组成三角形,记录有效三角形的个数即可。a.如果left==left--,那么我们找到的下一个三元组必然和前一个相等!b.同理,如果right==right+1,那么我们找到的下一个三元组必然和前一个相等!

2024-10-16 23:00:00 2735 81

原创 【优选算法】——双指针(上篇)!

常⻅的双指针有两种形式,⼀种是对撞指针,⼀种是左右指针。⼀般⽤于顺序结构中,也称左右指针。• 对撞指针从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼 近。• 对撞指针的终⽌条件⼀般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循 环),也就是:◦ left == right (两个指针指向同⼀个位置)◦ left > right (两个指针错开)⼜称为⻳兔赛跑算法,其基本思想就是使⽤两个移动速度不同的指针在数组或链表等序列 结构上移动。

2024-10-15 19:27:56 2357 76

原创 C++从入门到起飞之——AVL树 全方位剖析!

• 更新后parent的平衡因⼦等于1或-1,更新前更新中parent的平衡因⼦变化为0->1或者0->-1,说 明更新前parent⼦树两边⼀样⾼,新增的插⼊结点后,parent所在的⼦树⼀边⾼⼀边低,parent所 在的⼦树符合平衡要求,但是⾼度增加了1,会影响arent的⽗亲结点的平衡因⼦,所以要继续向上 更新。0不是更 好的平衡吗?• 插⼊结点,会增加⾼度,所以新增结点在parent的右⼦树,parent的平衡因⼦++,新增结点在 parent的左⼦树,parent平衡因⼦--

2024-10-13 14:51:17 1699 81

原创 C++从入门到起飞之——(multi)set与(multi)map的的使用 全方位剖析!

• set的声明如上,T就是set底层关键字的类型• set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模 版参数• set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参 数。• ⼀般情况下,我们都不需要传后两个模版参数。• set底层是⽤红⿊树实现,增删查效率是O(logN),迭代器遍历是⾛的搜索树的中序,所以是有序 的。

2024-10-10 23:16:52 2212 94

原创 【Linux庖丁解牛】—Linux基本指令(中)!

由于find具有强大的功能,所以它的选项也很 多,其中大部分选项都值得我们花时间来了解一下。当我们使用cat指令想要获取一个文件当中的内容时,如果我们不指定文件,则默认到键盘文件当中获取(读取)内容,如果我们使用(

2024-10-03 12:00:24 2058 115

原创 C++从入门到起飞之——二叉搜索树 全方位剖析!

场景1:⼩区⽆⼈值守⻋库,⼩区⻋库买了⻋位的业主⻋才能进⼩区,那么物业会把买了⻋位的业主的 ⻋牌号录⼊后台系统,⻋辆进⼊时扫描⻋牌在不在系统中,在则抬杆,不在则提⽰⾮本⼩区⻋辆,⽆ 法进⼊。场景2:商场⽆⼈值守⻋库,⼊⼝进场时扫描⻋牌,记录⻋牌和⼊场时间,出⼝离场时,扫描⻋牌,查 找⼊场时间,⽤当前时间-⼊场时间计算出停⻋时⻓,计算出停⻋费⽤,缴费后抬杆,⻋辆离场。场景2:检查⼀篇英⽂⽂章单词拼写是否正确,将词库中所有单词放⼊⼆叉搜索树,读取⽂章中的单 词,查找是否在⼆叉搜索树中,不在则波浪线标红提⽰。

2024-09-29 15:01:09 1256 86

原创 C++从入门到起飞之——多态 全方位剖析!

多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了 Person。Person对象买票全价,Student对象优惠买票。

2024-09-22 19:06:53 1934 107

原创 【Linux庖丁解牛】—Linux基本指令(上)!

命令是Linux系统管理和文件浏览中的一个强大工具,通过其提供的各种选项,你可以轻松地以图形化的方式查看和理解复杂的目录结构。我们甚至还可以将我们的code.c文件拷到usr/bin目录下,然后和文件自带的指令一样不用指定绝对路径就可以执行我们的指令!(这里特指inode change time)指的是文件的不同时间戳,它们各自代表了文件的不同方面的变化。指令是Linux系统中一个非常实用的工具,能够帮助用户快速找到命令的执行文件路径,方便执行和管理命令。命令(这在Windows的命令提示符中是常见的)。

2024-09-20 21:50:41 2132 80

原创 C++从入门到起飞之——继承下篇(万字详解) 全方位剖析!

所以,我们一定要记住,无论在什么情况下,我们都不要显示调用父类的析构函数,多次析构可能会引起程序的崩溃!5. 派⽣类对象初始化。

2024-09-16 15:18:28 1460 101

原创 C++从入门到起飞之——继承上篇 全方位剖析!

下⾯我们看到Person是基类,也称作⽗类。Student是派⽣类,也称作⼦类。(因为翻译的原因,所以 既叫基类/派⽣类,也叫⽗类/⼦类)

2024-09-13 08:54:20 1628 81

原创 C++从入门到起飞之——模版进阶&分离编译 全方位剖析!

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有 目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误不过由于模版超高的优越性,这点缺陷也就显得微不足道了!

2024-09-09 11:04:41 1420 95

原创 C++从入门到起飞之——priority_queue(优先级队列) 全方位剖析!

1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素 中最大的。2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶 部的元素)。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue 提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的 顶部。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。

2024-09-07 15:21:18 2504 92

原创 C++从入门到起飞之——stack&queue&deque 全方位剖析!

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设 计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端 进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与 list比较,空间利用率比较高。deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个 动态的二维数组。

2024-09-06 15:07:27 1900 82

原创 C++从入门到起飞之——list模拟实现 全方位剖析!

但是,list如果我们还是使用原生指针的话就完全做不到迭代器的效果,因为我们对节点指针*取到的是节点本身,而不是节点里面的数据,对节点++或--,因为链表不是连续的物理空间,所以我们并不能拿到前一个或后一个的迭代器反而让迭代器成了野指针!list就是我们所熟悉的数据结构链表,通过查看源码以及我们对链表的了解我们知道在类模版list中的成员变量一个是指向有效链表的哨兵卫头结点_head,另一个是记录有效元素个数的_size,而链表中的有效元素的存储地址空间不是连续的,所以并没有容量capacity的概念!

2024-08-30 21:55:06 1975 100

原创 C++从入门到起飞之——list使用 全方位剖析!

假如我们想要在list的正向迭代器后的第三位置插入一个2,在上面的这种写法就不再支持了!而我们之前在string和vector的使用时这样玩是完全没有问题的!那是为什么呢!通过查阅文档资料,我们可以发现在list下的的迭代器是bidirectional iterator(双向迭代器)那双向迭代器又是什么意思呢?下面我就和大家总结一下迭代器从功能和性质上的分类:>从功能上可分为以下四种:1、正向迭代器2、反向迭代器3、正向常量迭代器4、反向常量迭代器。

2024-08-28 21:19:27 1328 88

原创 C++从入门到起飞之——vector模拟实现 全方位剖析!

​。

2024-08-26 18:25:19 1904 89

原创 【Linux庖丁解牛】—Linux背景介绍&环境搭建!

这个系列的文章学习Linux系统编程,你可能要问Linux从哪里来?它是怎么发展的?在这里简要介绍Linux的发展史。要说 Linux,还得从UNIX说起。

2024-08-13 10:54:39 1247 137

原创 C++从入门到起飞之——深浅拷贝&string类补充 全方位剖析!

在构造时,将资源的计数给成1,每增加一个对象使用该 资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源, 如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放;如果,this的_str为随机值,那么在交换后,tmp在析构时会释放随机的空间。如果对象中管理资源,最后就会导致 多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该 资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规。但是,为了让效率提高,

2024-08-09 17:56:22 1403 116

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除