自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

不如敲代码的博客

记录工作点滴~

  • 博客(48)
  • 收藏
  • 关注

原创 Linux和Mac 通用批量更改文件名称的命令

1、通过find -exec1、find . -name "*.andnav" -exec rename -v 's/\.andnav$/\.tile/i' {} \; 当然在实际执行操作时删除-v,否则将浪费时间显示所有文件2、通过find | renamefind . -name "第*" |rename "s/aaa/bbb/g"find . -depth -name "第*" |rename "s/aaa/bbb/g" -depth 确保重命名首先在孩子上进行,然后在父母上进行,以防

2021-08-27 15:10:55 514

原创 Futex系统调用,Futex机制,及具体案例分析

Futex1、背景1.1 自己实现锁1.1.1 自旋锁1.1.2 sleep+自旋1.1.3 小结1.2 futex1.2.1 什么是Futex1.2.2 futex诞生之前1.2.3 futex诞生之后2、Futex系统调用3、Futex机制4、具体案例分析4.1 在Bionic中的实现4.2 C语言实现5、参考及扩展阅读首先要区分一下futex系统调用和futex机制。futex系统调用是操作系统提供给上层的系统调用接口。而futex机制是使用futex接口实现的一种锁。1、背景线程同步可以说

2021-06-30 12:54:34 10994 11

原创 Go打包二进制文件

Go打包二进制文件1 背景2 操作2.1 打包部署到centos72.1.1 打包环境:mac os2.1.2 打包环境:windows1 背景众所周知,go语言可打包成目标平台二进制文件是其一大优势,如此go项目在服务器不需要配置go环境和依赖就可跑起来。2 操作2.1 打包部署到centos72.1.1 打包环境:mac os方法:进入main.go所在目录,输入如下命令,当前目录便会生成main的可执行文件CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go

2020-12-15 09:32:28 1646 2

原创 初次使用go mod开发golang项目

首先要记住,无论是go mod,还是GOPATH机制,都是为了让你的项目能够编译运行,那么编译无非就是寻找一些环境变量信息。GOPATH局限于指定路径下,而go mod将其项目解放出来,随便找个位置,简单操作几个命令,就可以找到编译信息啦。1、动手实践1.1 新建golang项目使用go mod 管理项目,就不需要非得把项目放到GOPATH指定目录下,你可以在你磁盘的任何位置新建一个项目,比如:在/Users/humorhan/Documents/路径下新建一个项目,名字testgo进入/U.

2020-11-27 09:26:03 2149

转载 Redis相关知识点

Redis相关知识点1、Redis为什么快呢?2、那为什么Redis6.0之后又改用多线程呢?3、Redis事务机制4、持久化方式有哪些?有什么区别?RDBAOF5、Redis的过期策略有哪些?惰性删除定期删除那么定期+惰性都没有删除过期的key怎么办?6、知道什么是热key吗?热key问题怎么解决?7、怎么实现Redis的高可用?主从架构哨兵8、能说说redis集群的原理吗?节点槽slot参考1、Redis为什么快呢?redis的速度非常的快,单机的redis就可以支撑每秒10几万的并发,相对于mys

2020-11-11 17:02:32 361

转载 docker搭建pxc集群--注意事项

docker搭建pxc集群1. 前言2. pxc集群PXC介绍PXC特性PXC优势3. pxc集群搭建1、环境准备2、开放如下防火墙端口3、下载PXC镜像(踩坑)4、创建并初始化集群5、创建docker网络6、创建PXC主节点7、创建PXC从节点8、PXC集群测试4、一些注意事项4.1 docker创mysql pxc集群第二个节点失败:4.2 数据卷存在的情况下,初始化pxc节点失败:1. 前言随着mysql存储的数据量越来越大,mysql查询单表时的响应速度也会随之变慢,尤其是当单节点承载的数据量超

2020-11-10 19:23:02 609

原创 docker虚拟机管理命令

0. 配置docker加速器(Centos7+)请首先执行以下命令,查看是否在docker.service 文件中配置过镜像地址。systemctl cat docker | grep '\-\-registry\-mirror'如果该命令有输出,那么请执行 systemctl cat docker查看 ExecStart= 出现的位置,修改对应的文件内容去掉 --registry-mirror 参数及其值,并按接下来的步骤进行配置。如果以上命令没有任何输出,那么就可以在 /etc/docker.

2020-11-09 23:18:39 190

转载 通俗的解释云计算 公有云 私有云 混合云

云计算提出的愿景,是要像用水用电那样使用IT服务。建立了水厂发电厂集中提供水电,家庭不再需要挖水井和买发电机,只要通过水管和电线便可享受专业的更高水平的水电服务,且按需付费,若短期突然要大量用水用电,也无需担心资源不足,用多用少可自主决定。类比到IT,便是云计算服务提供商建设好大规模的IT基础设施,通过互联网(网线或无线)为企业提供服务器(虚拟机)、存储、应用程序等的租用,企业无需自己再建设IT基础设施,便可享受专业的更高水平的IT服务,且按需付费,若短期内业务访问量暴增(如双11)需要更多的计算资源,也无

2020-11-09 22:29:51 1153

原创 Linux安装Redis

系统版本为centOS 7.3一、下载Redis在 http://download.redis.io/releases/ 找到自己需要的版本wget http://download.redis.io/releases/redis-5.0.9.tar.gz如果没有安装wget,yum install wget -y二、解压tar zxvf redis-5.0.9.tar.gzcd redis-5.0.9三、编译make如果没有gcc,yum install gcc -y四、安

2020-11-09 18:41:08 133

转载 点滴知识:高级程序语言都是怎么发明的?

很有意思的问题,高级语言是用低级语言写出来的吗?是,也不是。这个问题曾经也困扰过我,这里和大家分享一下我认识到答案的过程。一开始学计算机的时候,我一直以为C语言这种高级语言,肯定是用汇编语言写出来的。直到大学时候遇到一位很好的Linux老师,给我们分享了一个令人震惊的事实:C语言的编译器,是用C语言写的。这让班里的小伙伴十分纳闷,这不就是“鸡生蛋,蛋生鸡”的问题吗?要让C语言编译通过,就需要一个C语言编译器。但是C语言编译器是用C写的。那么世界上第一个能执行的编译器,是如何编译的呢?当时老师所说的

2020-10-26 00:18:56 874

原创 点滴知识:交叉编译是什么?

在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系

2020-10-25 23:45:20 225

转载 简单理解:Bitmap和布隆过滤器(Bloom Filter)

Bitmap算法与其说是算法,不如说是一种紧凑的数据存储结构。其实如果并非如此大量的数据,有很多排重方案可以使用,典型的就是哈希表。public int[] removeDuplicates(int[] array) { int index = 0; int[] newArray = new int[array.length]; Map<Integer, Boolean> maps = new LinkedHashMap<Integer, Boolean>();

2020-10-25 23:22:26 2791

转载 正确的git开发流程

第一步在github中创建一个新的仓库,这时候项目是空的,而且只有一个master分支第二步第一个开发人员进来了,他在本地创建一个develop分支,并且提交到远程git branch developgit push -u origin develop现在线上就有两个分支master 和 develop 现在这两个分支里面都是空的第三步一、二步完成后,任何一个参与该项目的开发人员首先要做的就是从develop分支上切一个新分支进行功能开发git checkout -b <本地分支

2020-10-21 14:04:27 484

原创 面试问题之【InnoDB一棵B+树可以存放多少行数据?】

这个问题的简单回答是:约2千万。在计算机中磁盘存储数据最小单元是扇区,一个扇区的大小是512字节,而文件系统(例如XFS/EXT4)他的最小单元是块,一个块的大小是4k,而对于我们的InnoDB存储引擎也有自己的最小储存单元——页(Page),一个页的大小是16K。innodb的所有数据文件(后缀为ibd的文件),他的大小始终都是16384(16k)的整数倍。磁盘扇区、文件系统、InnoDB存储引擎都有各自的最小存储单元。在MySQL中我们的InnoDB页的大小默认是16k,当然也可以通过参数设

2020-10-07 16:24:15 207

原创 LFU原理及其实现(C++)

读完本文,你不仅学会了算法思路,还可以顺便去 LeetCode 上拿下如下题目:460.LFU缓存机制LFU 算法LRU 算法的淘汰策略是 Least Recently Used,也就是每次淘汰那些最久没被使用的数据;而 LFU 算法的淘汰策略是 Least Frequently Used,也就是每次淘汰那些使用次数最少的数据。方法一:哈希表 + 平衡二叉树本方法需要使用到「平衡二叉树」。在 C++ 语言中,我们可以直接使用 std::set 类作为平衡二叉树;思路和算法首先我们定义缓存的数据结

2020-10-06 20:23:49 2207

原创 LRU原理及其实现(C++)

读完本文,你不仅学会了算法思路,还可以顺便去 LeetCode 上拿下如下题目:146.LRU缓存机制LRU原理在一般标准的操作系统教材里,会用下面的方式来演示 LRU 原理,假设内存只能容纳3个页大小,按照 7 0 1 2 0 3 0 4 的次序访问页。假设内存按照栈的方式来描述访问时间,在上面的,是最近访问的,在下面的是,最远时间访问的,LRU就是这样工作的。但是如果让我们自己设计一个基于 LRU 的缓存,这样设计可能问题很多,这段内存按照访问时间进行了排序,会有大量的内存拷贝操作,所以性能肯定

2020-10-06 14:21:24 613

原创 Linux 进程调度深入理解

Linux 进程调度1. Linux调度策略概览2. 实时(Real-Time)调度策略2.1 示例3. 普通调度策略3.1 Linux进程调度(CFS)的实现3.1.1 运行时间记录(Time Counting)3.1.2 进程选择(Process Selection)3.1.3 调度程序入口(The Scheduler Entry Point)3.1.4 睡眠和唤醒(Sleeping and Waking Up)3.2 上下文切换和调度时间点Linux的调度策略区分实时进程和普通进程,实时进程的优先级

2020-10-05 20:38:25 484

原创 深入理解C语言-函数指针 (2)

1. 函数指针的定义顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。看例子:A) char * (*fun1)(char * p1,char * p2);B) char * *fun2(char * p1,char * p2);C) char * fun3(char * p1,char * p2);看看上面三个表达式分别是什么意思?C)这很容易,fun3是函数名,p1,p2是参数,其类型为char 型,函数的返回值为char 类型。B) 也很简单,与C)表达式相比,唯一不同的

2020-10-05 17:31:41 169

原创 深入理解C语言- typedef void (*Fun) (void) - typedef函数指针

首先介绍大家比较熟悉的typedefint i;//定义一个整型变量itypedef int myInt;myInt j;//定义一个整型变量j上面介绍得是我们常用的比较简单的typedef的用法,下面首先介绍一下函数指针。函数指针的形式:形式1:返回类型(*函数名)(参数表)#include <iostream> using namespace std;//定义一个函数指针pFUN,它指向一个返回类型为char,有一个整型的参数的函数char (*pFun)(int)

2020-10-05 17:20:03 1387 1

原创 深入理解C语言-函数指针 (1)

函数指针函数类型基础示例 1:一般的函数调用函数指针变量示例 2:通过函数指针变量来调用函数总结:示例 3:深入理解函数指针地址&总结:示例 4: 函数指针作为某个函数的参数函数指针在C++中有着重要的应用,函数的函数名其本质就是代表一个地址,这个地址叫做函数入口,得到这个地址就可以对这个函数进行各种操作。函数类型基础函数三要素: 名称、参数、返回值C语言中的函数有自己特定的类型C语言中通过typedef为函数类型重命名,类似于定义数组示例 1:一般的函数调用void myFun(in

2020-10-05 17:15:06 400

原创 linux中的条件变量

条件变量1.什么是条件变量2.条件变量有什么用3.条件变量的用法3.1 创建和注销3.2 等待和唤醒3.2.1 等待3.2.2 唤醒3.2.3 唤醒丢失问题4. 实例1.什么是条件变量条件变量是利用线程间共享的全局变量进行同步的一种机制。主要包括两个动作:一个线程等待”条件变量的条件成立”而挂起;另一个线程使”条件成立”(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。条件变量类型为pthread_cond_t。2.条件变量有什么用使用条件变量可以以原子方式阻塞线程

2020-10-05 16:10:04 457

原创 MySQL索引背后的数据结构及算法原理

1. 摘要本文以MySQL数据库为研究对象,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。2. 数据结构及算法基础目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构3. MySQL索引实现在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对

2020-10-05 11:39:25 166

转载 优秀数据结构学习 - 共享内存无锁队列的实现(二)

https://mp.weixin.qq.com/s/RqHsX3NIZ4_BS8O30KWYhQ1 关键技术1.1 基于共享内存的存储和通信操作系统提供的进程间通信机制有文件、socket、消息队列、管道、共享内存等。其中,共享内存是最快的IPC机制[6]。共享内存映射到进程空间后,数据可以直接从共享内存进行读写,不需要执行系统调用进行数据的传输。因此,避免了其它进程间通信机制必须的用户态/内核态切换以及用户空间与内核空间的数据拷贝。由于消息队不需支持跨主机通信,所以可以采用共享内存进行进程.

2020-09-25 14:56:19 711

转载 优秀数据结构学习 - 共享内存无锁队列的实现(一)

共享内存无锁队列的实现1. 为什么需要共享内存无锁队列?2. 环形数组3. 一写一读4. 多写一读4.1 常见的错误实现:4.2 我的优化一:4.3 我的优化二:4.4 内存模型5. 共享内存6. 需要多读吗?7. 有感而发1. 为什么需要共享内存无锁队列?为了便于查找定位问题,需要做一个日志收集跟踪系统,每个业务模块都需要调用SDK输出格式化的本地日志并将日志发送到远端。为了避免发送日志阻塞业务,典型的做法是业务线程将日志写入队列,另一个线程异步地从队列中读取数据并发送。考虑到IO性能,且日志数据能

2020-09-25 11:44:52 1430 1

原创 (精简理解)DPDK的无锁环形队列Ring

这里写目录标题1. DPDK Ring简介2. Ring实现2.1 单一生产者入队2.2 单一消费者出队2.3 多个生产者入队2.4 多个消费者出队3 总结3.1 入队列3.2 出队列1. DPDK Ring简介dpdk实现了一个无锁环形队列Ring,可用于在dpdk不同的应用程序之间进行通信。逻辑上ring看起来如下图:在使用这个结构的时候,一般是将1个核作为生产者,向这个ring队列里面添加数据;另一个core或者多个core 作为消费者从这个ring队列中获取数据。生产者核访问上面的pro

2020-09-25 10:54:03 1759

原创 linux内核之无锁缓冲队列kfifo原理(结合项目实践)

Linux kernel里面从来就不缺少简洁,优雅和高效的代码,只是我们缺少发现和品味的眼光。在Linux kernel里面,简洁并不表示代码使用神出鬼没的超然技巧,相反,它使用的不过是大家非常熟悉的基础数据结构,但是kernel开发者能从基础的数据结构中,提炼出优美的特性。kfifo就是这样的一类优美代码,它十分简洁,绝无多余的一行代码,却非常高效。关于kfifo信息如下:本文分析的源代码版本: 2.6.24.4kfifo的定义文件: kernel/kfifo.ckfifo的头文件: incl

2020-09-23 12:48:12 5101 3

转载 DPDK 全面分析

转载自 公众号:Linux云计算网络(id: cloud_dev)DPDK1 高性能网络技术2 C10K 到 C10M 问题的演进#3 基于 OS 内核的数据传输有什么弊端?4 解决方案探讨5 DPDK 的突破5.1 UIO (用户空间的 I/O 技术)的加持。5.2 内存池技术5.3 大页内存管理5.4 无锁环形队列5.5 poll-mode网卡驱动5.6 NUMA5.7 CPU 亲和性5.8 多核调度框架6 dpdk 的应用#7 总结1 高性能网络技术随着云计算产业的异军突起,网络技术的不断创.

2020-09-23 10:50:25 3693

原创 Linux glib库hash表GHashTable介绍

GHashTable1 简单使用2 原理分析3 思考总结1 简单使用hash表是一种提供key-value访问的数据结构,通过指定的key值可以快速的访问到与它相关联的value值。hash表的一种典型用法就是字典,通过单词的首字母能够快速的找到单词。要使用一个hash表首先必须创建它,glib库里有两个函数可以用于创建hash表,分别是g_hash_table_new()和g_hash_table_new_full(),它们的原型如下: GHashTable *g_hash_table_new(G

2020-09-23 09:45:16 2845

原创 linux内核之哈希链表

本文只是对linux内核中的链表进行分析。内核版本是2.6.32。文件在:/include/linux/list.h。linux内核中的哈希链表和其他链表不一样。他是头节点用单个的链表,只有next指针,但其他链表节点是有next和prev两个指针的双链表。由上图可以知道hash链表中存在两种结构体,一种是hash表头,一种是hash节点。hash表头:struct hlist_head{ struct hlist_node *first;};表头里面只存放一个hlist_node的指.

2020-09-22 20:50:36 2095

原创 Linux网络协议栈 —— 套接字缓存(socket buffer)

套接字缓存(socket buffer)1 套接字缓存1.1 sk_buff1.2 与sk_buff相关的函数2 套接字缓存队列(Socket-Buffer Queues)2.1 sk_buff_head2.2 与sk_buff_head相关的函数Linux网络核心数据结构是套接字缓存(socket buffer),简称skb。它代表一个要发送或处理的报文,并贯穿于整个协议栈。1 套接字缓存skb由两部分组成:(1) 报文数据:它保存了实际在网络中传输的数据;(2) 管理数据:供内核处

2020-09-22 20:31:13 1294

转载 数据包接收系列 — 下半部实现(软中断)

内核版本:2.6.37下半部的实现接收数据包的下半部处理流程为:net_rx_action // 软中断 |--> process_backlog() // 默认poll |--> __netif_receive_skb() // L2处理函数 |--> ip_rcv() // L3入口net_rx_action软中断(NET_RX_SOFTIRQ)的处理函数net_rx_ac

2020-09-22 10:59:44 294

转载 数据包接收系列 — 上半部实现(内核接口)

这里写目录标题1 上半部的实现2 netif_rx3 softnet_data4 enqueue_to_backlog内核版本:2.6.371 上半部的实现接收数据包的上半部处理流程为:el_interrupt() // 网卡驱动 |--> el_receive() // 网卡驱动 |--> netif_rx() // 内核接口 |--> enqueue_to_backlog() /

2020-09-22 10:48:28 269

转载 数据包接收系列 — 上半部实现(网卡驱动)

上半部实现(网卡驱动)1 网卡概述1.1 网卡收包1.2 网卡发包1.3 网卡数据结构1.4 网卡中断处理函数2 上半部的实现2.1 el_interrupt2.2 el_receive内核版本:2.6.371 网卡概述1.1 网卡收包网线上的物理帧首先被网卡芯片获取,网卡芯片会检查物理帧的CRC,保证完整性。然后网卡芯片将物理帧头去掉,得到MAC包。网卡芯片会检查MAC包内的目的MAC地址,如果和本网卡的MAC地址不一样则丢弃(混杂模式除外)。之后网卡芯片将MAC帧拷贝到网卡内部的缓冲区,触

2020-09-22 10:31:47 415

转载 数据包接收系列 — 数据包的接收过程(宏观整体)

本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的。如果英文没有问题,强烈建议阅读后面参考里的两篇文章,里面介绍的更详细。本文只讨论以太网的物理网卡,不涉及虚拟设备,并且以一个UDP包的接收过程作为示例.本示例里列出的函数调用关系来自于kernel 3.13.0,如果你的内核不是这个版本,函数名称和相关路径可能不一样,但背后的原理应该是一样的(或者有细微差别)网卡到内存网卡需要有驱动才能工作,驱动是加载到内核中的模块,负责衔接网卡和内核的网络模块,驱动在加载的时候将自己注册

2020-09-22 10:17:12 1940 1

原创 同步(1):自旋锁,等待队列

同步(1)自旋锁,等待队列1 概述1.1 并发程序设计的本质1.2 硬件架构2 Linux内核同步2.1 自旋锁(spin lock)2.1.1 硬件支持2.1.2 自旋锁的实现2.2 睡眠与唤醒2.2.1 等待队列2.2.2 等待事件(Waiting on the Event)2.2.3 唤醒(Waking Up)2.2.4 互斥等待1 概述同步问题是操作系统中的经典问题,它伴随着并发处理而自诞生。现代体系结构中常见的并发处理情况可以分为如下三种情况:(1) 多个线程在单处理器上执行——多线程编程

2020-09-22 09:52:56 792

原创 Linux协议栈--NAPI机制分析

目录标题1 概述2 实现2.1 NAPI设备结构2.2 初始化2.3 调度2.4 轮询方法2.5 非NAPI和NAPI处理流程对比3 简单使用内核版本:2.6.371 概述NAPI是linux新的网卡数据处理API,据说是由于找不到更好的名字,所以就叫NAPI(New API),在2.5之后引入。简单来说,NAPI是综合中断方式与轮询方式的技术。中断的好处是响应及时,如果数据量较小,则不会占用太多的CPU事件;缺点是数据量大时,会产生过多中断,而每个中断都要消耗不少的CPU时间,从而导致效率反而不

2020-09-21 18:53:21 1541

原创 内核抢占和中断(区别)

抢占是内核对进程的管理:当高优先级的任务因中断而成为就绪,特定的低优先级进程将让出CPU,而那个高优先级的进程得到CPU。 可以这样(简单地)说,中断是因为硬件,而抢占是因为中断带来特定事件的发生。以前一直不理解什么是内核抢占,现在好像懂了。本文尝试解释什么是内核可抢占以及可抢占和可中断的区别。首先被中断不是被抢占,中断和抢占是两个概念。抢占必须涉及进程上下文的切换,而中断是在中断上下文。所谓可抢占抢的是进程上下文,人人都争取上台。可中断指的是是否可以中断当前CPU而进入我的中断处理函数。如果内

2020-09-21 17:16:15 3955

原创 linux内核之链表

//include/linux/list.h struct list_head { struct list_head *next, *prev; }; #define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)#define INIT_LIST_HEA

2020-09-21 14:52:08 73

原创 fork()与vfork()函数(精简)

这里写目录标题0 简介1 fork函数1.1 代码示例1.2 分析1.3 写时复制技术(Copy On Write)2 vfork函数2.1 代码示例2.2 分析3 区别参考0 简介这两个函数都是创建进程的函数:首先了解一下什么是进程:进程是计算机上的程序关于某个数据及时上的一次运行活动。进程的四要素:(1)有一段程序供其执行(不一定是一个进程所专有的),就像一场戏必须有自己的剧本。(2)有自己的专用系统堆栈空间(私有财产)(3)有进程控制块(task_struct)(“有身份证,PID”)

2020-09-17 22:04:45 151

原创 exit _exit return区别详解

return返回函数值,是关键字; exit 是一个函数。return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。return是函数的退出(返回);exit是进程的退出。return是C语言提供的,exit是操作系统提供的(或者函数库中给出的)。return用于结束一个函数的执行,将函数的执行信息传出个其他调用函数使用;exit函数是退出应用程序,删除进程使用的内存空间,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些..

2020-09-17 18:07:47 419

空空如也

空空如也

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

TA关注的人

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