自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 资源 (1)
  • 收藏
  • 关注

原创 Unity在导出IOS工程中添加framework引用

示例如下,把如下文件放到Editor目录下,打包IOS的时候就会添加CoreImage和VideoToolbox两个framework。

2023-10-08 11:51:57 252

原创 C# UDP发送时发生异常 System.Net.Sockets.SocketException (0x80004005): Invalid handle

System.Net.Sockets.SocketException (0x80004005): Invalid handle 异常排查记录

2022-03-11 23:50:55 7059

原创 开篇词:如何驾驶 Linux 这辆性能出色的越野车

Linux 的优秀之处自然不必多说。如果将操作系统比作一辆汽车,那 Linux 就是一辆性能出色的多功能越野车,上山下海飞天无所不能。如果你拥有了它,一定不会只满足于驾驶它上下班,不能只会挂挡、踩油门和控制方向之类的基本操作。我们想充分了解并掌握它,挖掘其更多潜能。但是,这个过程有相当的难度。Linux 系统编程的难点我们来看看掌握 Linux 的拦路虎。对于有一定 Linux 开发基...

2020-09-22 12:06:11 239

原创 第01课:细说系统调用规范,入行要先熟悉套路

本课程主要带大家深入研究 Linux 系统编程。系统编程的任务,可以定义为使用系统提供的功能解决我们面对的实际问题,而系统调用,则是系统开放给应用执行特定功能的接口。本文首先从 Linux 系统调用讲起,主要包括以下内容:系统调用概述系统调用的两种调用方式系统调用的两种执行过程系统调用的标准使用方法另外,还会扩展两个知识点:与早期 Linux 相比,2.6 以后版本的内核,是如何...

2020-09-22 12:06:09 280

原创 第02课:精细控制文件 I/O,编写更稳健的应用

在 Linux 中有条重要的哲学,即一切皆文件,本文就来着重讲讲文件操作。首先从磁盘文件开始,探讨除打开、读、写、关闭等常规操作外,还有哪些可控操作。理解和掌握各个步骤的行为细节,可以帮助开发者写出性能更好、更加稳健的应用。本文主要包括以下几部分内容:默认的文件读写行为在应用层选择合适的文件 IO 缓存控制文件内容在磁盘设备上的更新控制文件内容的预读取策略混合使用库函数和系统调用2...

2020-09-22 12:06:08 245

原创 第03课:深入程序布局内部,增强应用控制能力

本文将探讨程序的静态布局和动态布局。静态布局指可执行文件在硬盘上的内部布局,而动态布局,则是程序被系统加载到内存之后的布局。主要包括以下几部分内容:可执行文件里有什么影响程序静态布局的因素如何控制程序的动态布局检查地址范围3.1 可执行文件里有什么对于这个问题,相信有经验的开发人员都能给出这样的回答:可执行文件包含了源文件编译生成的可执行指令和数据。在日常开发中,理解到这个程度已经...

2020-09-22 12:06:06 172

原创 第04课:理解进程内存排布,掌握程序动态

简单来讲,进程就是运行中的程序。更进一步,在用户空间中,进程是加载器根据程序头提供的信息将程序加载到内存并运行的实体。在本文中,我们就来深挖进程在用户空间内的更多细节,主要包括以下几部分内容:进程的虚拟空间排布进程的启动监控子进程的状态进程的终止4.1 进程的虚拟空间排布4.1.1 虚拟空间及其功能在理解虚拟空间排布之前,先要明确虚拟空间的概念。上一篇,我们讲解的 ELF 文件头...

2020-09-22 12:06:04 202

原创 第05课:理解线程实现,达成高效率与低复杂度

目前,多线程模型非常常见,从终端应用到大型服务器程序都会大量使用。在本文中,我们就来深入探究下 Linux 线程的内部细节,让读者对线程的把控更加胸有成竹,得心应手,主要包括以下几方面内容:线程的内存布局线程的实现方案内核中的用户线程与进程线程的同步线程的连接和分离线程的取消线程特有数据5.1 线程的内存布局一个进程可以包含多个线程。多个线程可以并发执行,从而提高系统整体吞吐...

2020-09-22 12:06:02 122

原创 第06课:探究进程间通信技术,优化数据传输效率

在前面的课程中,我们讲过不同进程运行在各自的虚拟地址空间内,相互之间被操作系统隔离开。就像在《黑客帝国》中,每个人都生活在一个封闭的充满营养液的容器里,人与人之间利用接在后脑勺的数据线通过 Matrix 互相交流一样,在 Linux 中进程间的相互通信需经过内核中转。内核中转的不同实现方式,催生出了进程间不同的通信技术。在本文中,我们就来探究进程间通信的不同方式及底层实现原理,主要包括以下几方面...

2020-09-22 12:06:01 122

原创 第07课:解析共享库工作机理,灵活组织大型项目

共享库的使用在当今的各类计算机系统中都已经非常常见,它的出现让大型项目的组织形式更加灵活,管理更加方便,而且极大地节省了需要的存储和运行空间。本节课我们就来深入到共享库的内部去了解一下其工作的细节,主要包括以下几方面内容:共享库产生的渊源位置独立代码的工作原理动态链接器的工作过程共享库的版本维护7.1 共享库产生的渊源7.1.1 静态库在共享库出现之前,公用功能是以静态库的形式存...

2020-09-22 12:05:59 197

原创 第08课:理解文件系统设计思想,站在巨人肩上

对任何计算机系统来说,数据都是非常重要的资产,计算机中的数据通常是以文件的形式保存在磁盘上的。对大多数的计算机用户来说,通常只需要关心文件呈现出来的组织方式,而不需要关心它们在磁盘上保存和管理的技术细节。但是对某些特殊应用的开发人员来说,仅仅了解到这种程度是远远不够的,还需要对数据在磁盘上的组织方式的细节有更深入地理解,有时甚至还需要针对特定的应用场景设计自己的文件系统。本节课我们就以历史悠久而...

2020-09-22 12:05:58 304

原创 第09课:掌握信号处理,稳健处理中断和异常

信号在操作系统中有悠久的历史,信号的概念和使用方式都非常简单,但是要编写出真正实用而稳定的信号处理程序却并不容易。本节课我们就来深入地了解一下 Linux 中信号处理的底层细节,帮助读者更好地利用系统的各种信号,主要包括以下几方面内容:信号的基本概念信号处理流程可重入与异步安全信号处理程序注意要点信号对阻塞的系统调用的中断9.1 信号的基本概念信号是操作系统中当某个事件发生时对...

2020-09-22 12:05:56 172

原创 第10课:理解时钟与定时器,电子世界中的脉动

时钟对计算机系统来说非常重要,在硬件层面,时钟信号是推动 CPU 运转的动力源;在软件层面,很多非常重要的系统功能都依赖于对时间的度量和处理。本节课,我们就来深入了解一下计算机系统的定时硬件,学习 Linux 中的操作系统定时器的系统调用的使用方法,并讨论一下应用层定时器的实现思路,主要包括以下几方面内容:时钟与定时器概述Linux 传统间隔定时器Linux POSIX 定时器应用层定...

2020-09-22 12:05:55 593

原创 第11课:理解系统安全,保护你的重要资产

在互联网上运行的系统,安全性非常重要。对大多数的系统来说,验证登录用户的账号和密码是保护系统的第一道防线,本节课我们就来详细讨论一下 Linux 系统中账户密码的验证过程,主要包括以下几方面的的内容:Linux 验证登录用户的步骤;Linux 对用户敏感账户信息的保护手段;通过量化的计算让读者对 Linux 的安全性有直观的体会。11.1 Linux 验证登录用户不管是本地登录,还是...

2020-09-22 12:05:53 182

原创 第12课:掌握线程同步,让复杂工作流协调有序

从根本上说,多线程编程的最终目的,就是最大限度地利用 CPU 的计算资源,尽量让所有的 CPU 核心都保持忙碌状态。这里有两方面的意思:一是不要让 CPU 闲下来,保持它始终有工作做;二是尽量让所有的 CPU 都有大体相当的负载,不要出现有的 CPU 核心很忙,而有的 CPU 核心却没事可做的情况。CPU 什么时候会闲下来呢?最常见的情况就是在等待 I/O 操作的时候,所以,当某些工作...

2020-09-22 12:05:52 188

原创 第13课:活用内存映射与虚拟内存,让应用更高效

本节课,我们要介绍几个对虚拟内存进行系统级控制的系统调用,合理使用它们,能极大地提高应用的执行效率,增强应用的安全性,主要包括以下几方面内容:内存映射内存保护内存锁定13.1 内存映射13.1.1 概述内存映射的功能是在进程的内存映射表中建立一条新的映射表项,也就是分配一块新的虚拟内存给调用进程。并且,可以指定内存内容与某个文件内容相对应。提供内存映射功能的系统调用是:void...

2020-09-22 12:05:50 137

原创 第14课:合理控制优先级,根据职责赋予权利

Linux 是一个多用户多任务的操作系统,即使是在单核心 CPU 的系统上,用户也感觉系统中的多个进程在同时运行。实际上,内核使用的是一套固定的调度策略,多个进程轮流使用 CPU,并快速地轮流切换。但是,对于不同功能的进程,它们的任务优先级和对实时性的要求是不一样的,有什么办法能控制进程这一行为呢?在本节课中,我们就来介绍一下 Linux 中影响进程被内核调度的参数,并介绍控制这些参数的系统调用...

2020-09-22 12:05:49 142

原创 第15课:理解文件扩展属性,让属性设置无限灵活

在《第08课:理解文件系统设计思想,站在巨人肩上》一节课中,我们了解到文件通用和固定的属性信息是保存在索引节点中的。为了保持索引节点结构紧凑的同时,能够实现对文件属性的灵活扩展,Linux 内核从 2.6 开始添加了对扩展属性的支持。在本节课中,我们就来详细了解一下文件的扩展属性,包括它的使用和实现方式,同时还将讨论其在访问控制中的应用,以及其他可能的应用场景,主要包括以下几方面内容:文件扩...

2020-09-22 12:05:47 470

原创 第16课:监控文件系统,谁动了我的文件

文件系统监控功能在很多系统软件中都有重要的应用,如各种云同步软件、安全防护软件、多种开发工具,以及一些资产监控软件,等等。在本节课中,我们就来讨论一下 Linux 中的文件系统监控功能,包括它的使用方法和实现原理等,主要包括以下几方面内容:文件系统监控概述相关的系统调用创建初始 inotify 对象控制监控目标和事件读取发生的事件通知关闭监控对象底层实现原理系统限制16.1 ...

2020-09-22 12:05:46 154

原创 第17课:深入虚拟文件系统,文件哲学的延伸

特殊文件系统,指的是在磁盘上没有对应的存储数据的文件系统,这其中最常见的,要属记录进程和内核运行参数的 proc 文件系统。在本节课中,我们就来详细讨论一下 proc 文件系统,包括其中几个常用文件所包含的信息及可能的使用场景,主要包括以下几方面内容:proc 文件系统概述proc 文件系统详解注意事项17.1 proc 文件系统概述在 Linux 的内核中,虚拟文件系统转换层(V...

2020-09-22 12:05:44 110

原创 第18课:探究进程隐藏与反隐藏,知己知彼百战不殆

进程隐藏技术在主机和网络安全领域有很实用的应用。比如,对红方,安全人员会在蜜罐系统上隐藏一些敏感进程,防止引起入侵者的警觉;对黑方,有些木马程序会使用进程隐藏技术让自己躲过系统管理人员的排查和监控,从而让自己能不被察觉地在被攻击系统上长期运行。前者对自己的系统有完全的控制权,所以,采用修改 Linux 内核,增加进程隐藏机制的方式就可以很干净地实现;而后者,因为要尽量隐蔽自己的行踪,所以通常不...

2020-09-22 12:05:42 208

原创 第19课:深入内存管理,定制自己的内存管理系统

C/C++ 程序具有强大而灵活的内存操作能力,而要驾驭这种强大的能力,要求开发者具有与之匹配的内功。对内存使用不当,很容易造成非常严重的后果。在 C/C++ 开发中,经常遇到的比较头痛的内存使用问题有内存泄漏、内存重释放和内存溢出。在本节课中,我们就来重点讨论 Linux 应用的内存管理,并在现有内存管理机制的基础上,进一步讨论这几种常见内存使用问题的调试功能的实现思路,主要包括以下几方面内容:...

2020-09-22 12:05:41 111

原创 第20课:设计高性能网络服务器,能干活就别闲着

在软件开发行业中,一提到高性能,就会立即给人一种高大上的感觉。那么在同样的硬件平台上,为什么有的服务器可以称为高性能,而有的就不行呢?在本节课中,我们就拿一个网络服务器作为例子,看看它是如何从最简单的模型一步步演化而来,并且讨论每一步演化过程的改进之处,主要内容包含:最简单的网络服务器模型多进程服务器模型I/O 复用线程池模型增强版的 I/O 复用模型关于可写事件20.1 概述...

2020-09-22 12:05:39 176

原创 第21课:活用共享内存,降低用户数据丢失的风险

在之前的课程中,我们介绍过,共享内存是一种非常高效的进程间通信机制。在本节课中,我们会从共享内存可以脱离进程而持续保持的特性出发,探讨它在降低用户数据丢失风险方面的应用,主要包括以下几部分内容:共享内存特性概述共享内存相关接口使用共享内存保存用户数据共享内存作为网络消息队列关于共享内存的大小21.1 共享内存特性概述共享内存是进程间通信的一种机制。当不同的进程连接同一块共享内存时...

2020-09-22 12:05:37 422

原创 第22课:实现无锁数据结构,让多线程应用更快更稳定

在本节课中,我们要讨论的是无锁编程。我们会通过对基本无锁数据结构设计思路的介绍,来帮助读者入门无锁编程,主要包括以下几部分内容:无锁编程概述简单一对一无锁队列关于指令顺序22.1 无锁编程概述免费的午餐早已经结束,多线程编程已经成为当代系统开发者的一项基本技能。在《第12课:掌握线程同步,让复杂工作流协调有序》中,我们介绍了很多种线程间同步的锁方法,它们能很好地解决多个并行线程间协调...

2020-09-22 12:05:35 160

原创 第23课:跟踪系统事件,充分掌握系统运行动态

在本节课,我们要介绍 Linux 上两个非常有用的工具:ltrace 和 strace。在分析软件的运行过程、调试疑难 Bug、执行性能分析和调优等方面,它们都是非常有用的辅助工具。另外,我们还会介绍与之相关的一个功能强大的系统调用:ptrace。充分理解并掌握 ptrace 的使用,能够实现一些很“酷”的功能,主要包括以下几方面内容:23.1 概述Linux 开发人员,有时会遇到如下这样的开...

2020-09-22 12:05:34 130

原创 第24课:保护应用程序安全,保护自己也保护他人

本节课,我们讨论的主题是如何写出尽可能安全的应用程序。而要知道什么样的程序是安全的,就要先讨论程序会受到什么样的安全威胁,也就是常见的对应用程序的攻击手段,针对每种攻击手段,我们会给出提高程序安全性的防范建议。要讨论的内容主要包括:栈溢出攻击原理与防范堆溢出攻击原理与防范格式化字符串漏洞攻击与防范24.1 应用程序安全概述在互联网的世界里,安全是个永恒的话题,黑白两方的较量从来没有...

2020-09-22 12:05:32 105

原创 第25课:优化应用程序性能,好钢用在刀刃上

本节课,我们来讨论一下影响应用程序性能的不同方面,并针对性地提出优化应用程序性能的常用手段。我们将从以下几个方面分别进行讨论:优化网络性能优化文件访问性能优化内存使用性能优化 CPU 使用性能25.1 概述性能优化是大多数软件产品都会经历的一个非常重要的阶段。随着硬件计算能力的提升,以及越来越注重产品迭代速度的今天,性能优化经常会被安排在项目的后期,作为产品正式上线之前的一项重要...

2020-09-22 12:05:30 155

原创 结语:开上 Linux 这辆越野车,探索更广阔的世界

到这里,“攻克 Linux 系统编程”课程的全部内容就完结了。本节课会对课程的内容做一个简单总结,并提出进一步深入学习的建议。课程总结本课程的设计初衷在于,让读者对 Linux 系统编程所涵盖的内容能有一个全景的认识;同时,对一些与实际开发工作密切相关的底层原理,能有更加清晰地理解,从而在做设计和实现决策时,能够做出更正确的选择。在本课程中,我精选了 25 个兼具知识性和实用性的系统编程主题...

2020-09-22 12:05:28 80

原创 Linux系统调用 - 文件IO复用 (poll 与 ppoll)

这两个系统调用的作用,是在指定的文件描述符上监听发生的任何文件事件,以便继续执行后续的文件IO操作。其作用与最古老的文件IO复用接口select差不多,但是poll没有最多1024个文件描述符的限制,因此适用的范围更大。而且,poll接口中使用的数据结构的组织更加直观,操作更加方便。说到select系统调用的1024个文件描述符的数量限制,完全是历史遗留的产物,因为在select系统调用被创建...

2019-04-18 23:26:13 1166

原创 Linux系统调用 - 获取文件状态 (stat, lstat和fstat)

获取文件状态的系统调用有三个,分别是stat,fstat和lstat,其实他们的作用是一样的,都是查询某个文件的状态。如果查询成功,会把文件状态的信息填充在一个stat结构体中。他们的函数定义分别如下:int stat(const char *path, struct stat *buf);int fstat(int fd, struct stat *buf);int lstat(con...

2018-11-18 22:13:21 6506

原创 Unity 5.x中使用Protobuf

哎,各种坑,总算整差不多明白了,放了一个github工程,把配套的protobuf-net源码,dll和生成工具都放一起了。 注意仔细读README,如果使用mono的,直接把dll放到工程的Plugins目录下就行了,要选择.net 2.0,不能用.net 2.0 subset。 如果要使用il2cpp的,需要把协议文件与protobuf-net for Unity的dll文件一...

2018-11-01 11:52:17 1194

原创 Unity的IOS导出工程配置工具xcodeapi

在把Unity打包成IOS安装包时,经常需要自动化设置导出工程的各项配置。在Unity 4.x时代,常用的工具是XUPorter,在Unity 5.x之后,Unity官方提供了另外一套工具,叫做xcodeapi,因为是官方维护的,所以在使用上可以更放心,所以推荐使用。xcodeapi的工程链接在Unity的开源bitbucket上:https://bitbucket.org/Unity-T...

2018-10-27 21:36:17 1283

原创 xcode 12.0 常见错误

- 错误'xxxx' is unavailable: not available in automatic reference counting mode在老版本的xcode上编译通过的工程,升级xcode到12.0之后,报错:'xxxx' is unavailable: not available in automatic reference counting mode。报错的代码长...

2018-10-27 20:57:10 2595

原创 mac开发常用设置

用惯了Windows和Linux,刚切换到mac系统会有各种不习惯,在这里记录一些mac使用的小技巧吧,内容会慢慢补充。- 设置命令别名这一点和Linux没有什么区别,都是在根目录下创建默认的shell配置文件,mac系统默认使用的shell应该是bash,所以创编辑文件 ~/.bash_profile (如果没有这个文件就创建一个), 在里面添加alias命令,注意shell的语法中,=...

2018-10-27 12:14:23 523

原创 Linux系统调用 - shutdown

shutdown()系统调用的功能是关闭一个套接字的指定方向上的通信,函数原型:int shutdown(int sockfd, int how);参数how可以取的值分别为:SHUT_RD(关闭读取),SHUT_EW(关闭写入)和SHUT_RDWR(关闭读取和写入),其意义不言自明。这个函数也是遵照常规,成功执行之后会返回0,如果遇到错误,会返回-1,同时把错误原因设置到errno里...

2018-10-26 20:55:01 746

原创 Linux系统调用 - close

Close

2018-10-23 23:08:05 12048

原创 Linux系统调用 - write

write()系统调用向指定的文件描述符内写入指定字节数的内容,函数原型:ssize_t write(int fd, const void *buf, size_t count);其中参数count表示最多写入的字节数,返回值表是真正写入的字节数。有些情况下返回值有可能会比指定的字节数要少,例如存储设备上没有空间了,或者写入的文件大小超过RLIMIT_FSIZE的限制了,或者写入过程被信号...

2018-10-11 19:29:05 2046

原创 Linux系统调用 - read

read()系统调用的原型:ssize_t read(int fd, void *buf, size_t count);功能:从指定的文件描述符中读取最多count个字节的数据到指定的buf中去。如果传入的count是0,这个系统调用什么都不干,直接返回0。如果指定的count大于0,而且返回值也大于0,则表示函数执行成功,返回值表示成功读取的字节数,同时被读取的文件的当前数据指针会相应后移。...

2018-10-09 22:57:15 1014

原创 Linux系统调用 - open

open() 系统调用很有可能是Linux开发者用到的第一个系统调用,它打开一个指定目录上的文件或设备,必要的时候会创建一个。函数原型:int open(const char *pathname, int flags, ...);其中的可选参数是在创建文件的时候指定新文件的模式。flags参数应该至少包含一个访问模式:O_RDONLY,O_WRONLY或者O_RDWR,分别表示文件是只读的...

2018-10-09 11:36:15 700

用于区域生长合并的类

这时一个可以对数字图像进行区域生长合并的类

2008-04-04

空空如也

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

TA关注的人

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