Linux C/C++代码调试之深入熟悉使用GDB Coredump文件是什么?1.1 产生根因1.2 如何打开?1.3 如何设置文件名以及路径GDB理论部分2.1 基本命令2.2 被忽略但实用的命令2.3 实用的GDB设置GDB操作部分3.1 coredump文件是否任何时候都产生?3.2 系统函数是否可以打印coredump信息?3.3 调试案列(基本使用)3.4 调试案列(多进程)3.5 调试案列(多线程以及线程锁问...
深入探究 Linux C中进程崩溃 目录前言栈内存异常以及案列分享堆内存异常以及案列分享Ptmalloc的内存管理前言LinuxC的内存管理融入了设计者很多高效的算法和思想,提供了用户直接可以操作的内存的“指针”,这也是其他语言不涉及的(除Go语言21世纪的C语言),但是对于指针这把双刃剑,开发者操作着进程的内存,难免造成意想不到的崩溃问题,其实踩内存情况应该把栈和堆(ptmalloc)分开,因为linux对这两块的管理...
gRPC学习之简单模式(第三十九天) 简单模式:简单模式只是使用参数和返回值作为服务器与客户端传递数据的方式建立如下工程:编写文件proto文件syntax="proto3";package Model;message execlResponse{ int32 sid=1; int32 age=2; string name=3; string telephone=4; stri...
gRPC学习之简单实现C\S通信(第三十八天) 总结增加、修改一个grpc接口步骤:1.修改proto文件,新增修改一个service,相应的请求和回复的message2.使用protoc生成go代码3.server和cilent分别调用生成的go包里的方法这个也就是平台中立的体现,没有完全的平台中立,只是从新设计。thrift和 grpc的优劣:1.依据网络进行合理选择2.thrift是Facebook的开源rpc框架,thr...
微服务之技术栈(第二十六天) 这是Spring Cloud 体系,仅仅了解核心支撑组件服务网关 Zuul服务注册发现 Eureka+Ribbon服务配置中心 Apollo认证授权中心 Spring Security OAuth2服务框架 Spring MVC/Boot监控反馈组件数据总线 Kafka日志监控 ELK调用链监控 CATMetrics 监控 KairosDB健康检查和告警 ZMon限...
Go语言之gRPC+Protobuf搭建(第二十八天) 环境安装-Protobuf 安装1.安装Protobuf 编译器 protoc,下载地址:https://github.com/google/protobuf/releases我的是windows,将压缩包bin目录下的exe放到环境PATH目录中即可。...
Redis学习之查看服务器运行状态(第三十五天) 管理 redis 服务127.0.0.1:6379> INFO # Serverredis_version:5.0.8redis_git_sha1:00000000redis_git_dirty:0redis_build_id:fb7771d11d193afbredis_mode:standaloneos:Linux 3.10.0-327.el7.x86_64 x86_64...
Redis学习之事务(第三十四天) Redis 事务一个事务从开始到执行会经历以下三个阶段:开始事务,命令入队,执行事务。Redis 事务命令:序号 命令及描述1 DISCARD取消事务,放弃执行事务块内的所有命令。2 EXEC执行所有事务块内的命令。3 MULTI标记一个事务块的开始。4 UNWATCH取消 WATCH 命令对所有 key 的监视。5 WATCH key [key ...]监视一个(或多个...
Docker学习之安装(第三十五天) 环境安装DockerToolbox在Win7上的安装和设置Docker在Windows上使用有两种方式:1.利用VirtualBox建立linux虚拟机,在linux虚拟机中安装docker服务端和客户端2.利用Windows的Hyper-v虚拟化技术,直接在Windows上安装docker服务端和客户端。WIndows7不支持Hyper-v,采用Docker Toolbox的方式使用Do...
Redis学习之发布订阅(第三十六天) Redis 发布订阅Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。1.订阅者订阅,资源变更事件触发,发送者推送给订阅者(类似与广播或者组播)下图展示了消息通道 channel1 , 订阅的三个客户端 :当有新消息或者资源变更,通过 PUBLISH 命令发送给channel 时, 这个...
Redis学习之键(key)(第三十三天) 对于任何语言以及中间件,我们知道学习不能死记硬背,我们需要的知道思想,工具类的都是死的,我们甚至感觉不好用,可以自己造工具所以,关于Redis 的命令可以通过 ? COMMAND COUNT?的使用127.0.0.1:6379> ?redis-cli 5.0.8To get help about Redis commands type: "help @<group...
Redis学习之Redis 数据类型(第三十二天) Redis 数据类型Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)zset(sorted set:有序集合)string最基本的类型,一个 key 对应一个 value。是二进制安全的。意思是 redis 的 string 可以包含任何数据。如jpg图片或者序列化的对象。string 类型的值最大能存储 512MB127.0....
Redis学习之redis.conf(第三十一天) Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf查看配置通过 CONFIG 命令查看或设置配置项vim redis.conf 查看配置 CONFIG GET * 1) "dbfilename" 2) "dump.rdb" 3) "requirepass" 4) "" 5) "masterauth" 6) "" 7) "clust...
Redis学习之环境搭建(第三十天) 简述Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。数据结构服务器,因为(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。特点Redis 与其他 key - value 缓存产品有以下三...
微服务之RPC通信(第二十七天) RPC通信RPC,远程调用方式(Remote Procedure Call),RPC像调用本地方法一样调用别的机器上的方法,屏蔽了用户与服务器,服务器与服务器之间的通讯。客户端(Client),服务的调用方。服务端(Server),真正的服务提供者。客户端存根,存放服务端的地址消息,再将客户端的请求参数打包成网络消息,然后通过网络远程发送给服务方。服务端存根,接收客户端发送过来的消息...
微服务(第二十六天) 微服务微服务(Micro services)是架构演变的产物,相对于单体架构,它用了抽象的思维,将一个系统抽象化,拆成几个小的独立的服务,再把独立的服务串起来微服务特性:每个微服务都运行在自己的空间里;一系列独立运行的微服务共同构建起了整个系统;每个服务为独立的业务开发,一个微服务一般完成某个特定的功能,比如网络管理,用户管理等;微服务之间通过一些轻量级的通信机制进行通信,例如REST...
GO语言基础理论知识总结以及自评150题(第二十五天) 试题转自网上,答案解析是自己做的,如果有误差欢迎评论邮箱:910212084@qq.com选择题【初级】下面属于关键字的是()A. funcB. defC. structD. class参考答案:AC,func 定义函数,struct 定义结构体【初级】定义一个包内全局字符串变量,下面语法正确的是()A. var str stringB. str := “”C. st...
GO与C\C++\python输入输出函数小结(二十四天) C输入输出c语言的输入输出都是包含在头文件stdio.h中scanf() 与 printf()scanf() 函数用于从标准输入(键盘)读取并格式化printf() 函数发送格式化输出到标准输出(屏幕)#include <stdio.h>int main(){ int a = 0; char b = 'a'; char str[100] = {0}...
GO语言基础语法之并发 (第二十三天) Go 并发Go 语言并发,通过 go 关键字来开启 goroutine ,goroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。goroutine 语法格式:go 函数名( 参数列表 )例如:go fast(x, y, z) //开启一个新的 goroutine同一个程序中的所有 goroutine 共享同一个地址空间通道(channe...
GO语言基础语法之错误处理 (第二十二天) Go 错误处理Go 语言通过内置的错误接口 errors.New(“日志描述”),import “errors”package mainimport ( "errors" "fmt")func Sqrt(f float64) (float64, error) { if f < 0 { return 0 ,errors.New("negative number")...
GO语言基础语法之接口 (第二十一天) Go语言接口定义一个接口type 接口变量 interface {函数名称(形参列表)(返回值列表)函数名称(形参列表)(返回值列表)}注意点1.接口中只能有方法的声明, 不能有方法的实现2.接口中只能有方法的声明, 不能有变量的声明3.只有实现了接口中声明的所有方法, 才算实现了接口, 才能使用接口变量保存4.在实现接口的时候, 方法名称,形参列表,返回值列表必须一模一样5...
GO语言基础语法之递归函数 (第二十天) Go 语言递归函数Go 语言递归与C语言基本一样。调用递归时,需要设置退出条件,否则递归将陷入无限循环中。语法格式如下:func recursion() {recursion() /* 函数调用自身 */}func main() {recursion()}...
GO语言基础语法之Map(第十九天) Go 语言Map(集合)Map 是一种无序的键值对的集合。通过 key 来快速检索数据,key 类似于索引,指向数据的值。Map实现涉及两种数据结构,搜索树(红黑树)以及hash table,GO 是使用 hash 表来实现的。定义 Map/* 声明变量,默认 map 是 nil */var map_variable map[key_data_type]value_data_typ...
GO语言基础语法之Range(第十八天) GO中的关键字Rangefor循环中迭代数组(array)、切片(slice)、链表(channel)、集合(map)的元素在数组和切片中它返回元素的索引值(index)在Map中返回 key-value 对的 key 值通道(channel)只返回通道内的值package mainimport "fmt"func main() { //这是我们使用range去求一个slice...
GO语言基础语法之切片(第十七天) Go 语言切片(Slice),学习时候对比python 的切片Go 数组的长度固定,切片是内置类型,长度是不固定的,可以追加(append)元素,在追加后容量(cap)增大。定义切片声明未指定大小的数组来定义切片:var identifier []type //切片不需要说明长度区别于数组。使用make()函数来创建切片:var slice1 []type = make([]typ...
GO语言基础语法之结构体(第十六天) Go 语言结构体与C语言类似,Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。定义和C有些许差异,c中涉及 typedef (自定义类型) struct,有类型名和标签名概念。GO语言中结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一...
GO语言基础语法之指针(第十五天) 指针与C语言类似,go也有指针,指针的引用,使用者就可以直接使用指针修改、获取内存中的内容Go 语言的取地址符是 &,与C语言类似。GO语言的指针声明:var varName * varTypeC语言指针声明:varType * varNameGo 空指针:当一个指针被定义后没有分配到任何变量时,它的值为 nil。nil 指针也称为空指针。C语言空指针:值为 NU...
GO语言基础语法之数组(第十四天) 数组:与C语言类似,数组元素可以通过索引(位置)来读取(或者修改),索引从 0 开始,第一个元素索引为 0,第二个索引为 1,以此类推,一维数组的定义方式:Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:var variable_name [SIZE] variable_type。例如var str [10] float64多维数组声明方式:var variable_n...
GO语言基础语法之函数方法(第十三天) Go 语言中同时有函数和方法。方法就是包含了接受者的函数,方法是对象实例绑定的特殊函数。方法是特殊的函数,定义在某一特定的类型上,通过类型的实例来进行调用,这个实例被叫接收者(receiver)语法格式如下:func (variable_name variable_data_type) function_name() [return_type]{/* 函数体*/}注意:variabl...
GO语言基础语法之函数闭包(第十二天) Go 语言支持匿名函数,可作为闭包。从匿名函数角度:优越性在于可以直接使用函数内的变量,不必申明动态创建的特性,该特性使得匿名函数不用通过参数传递的方式,就可以直接引用外部的变量。其实理解闭包的类似看成C++中的一个类,一个闭包函数调用就是实例化一个类。根据类的角度看出哪些是“全局变量”,哪些是“局部变量”函数返回结果分别实例化了“闭包类”,在这个“闭包类”中有个“闭包全局变量”。...
GO语言基础语法之函数调用以及回调(第十一天) Go 语言函数函数是基本的代码块,执行一个任务,与C语言类似。Go 语言最少仅且有一个 main() 函数。函数声明告诉了编译器函数的名称,返回类型,和参数。Go 语言函数定义格式如下:func function_name( [parameter list] ) [return_types] {函数体}函数定义解析:func:函数由 func 声明function_name:函...
GO语言基础语法之控制语句(第十天) go语言的if 、if else与C语言相似,除了不需要括号()Go 语言 switch 语句switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 c...
GO语言基础语法之常量(第九天) Go 语言常量常量const是一个简单值的标识符,在程序运行时,不会被修改的量。常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。常量的定义格式:const identifier [type] = value你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。显式类型定义: const b string = “abc”隐式类型定义: ...
GO语言基础语法之变量(第八天) Go 语言数据类型1 布尔型布尔型的值只可以是常量 true 或者 false。列如:var b bool = true。2 数字类型整型 int 和浮点型 float32、float64,Go 语言支持整型和浮点型数字,并且支持复数,采用补码。3 字符串类型:字符串就是的字符序列。由单个字节连接起来的。使用 UTF-8 编码标识 Unicode 文本。4 派生类型:包括:(a)...
GO语言运行原理与其他语言对比(第四天) GO语言特点Go 语言虽然是静态编译型语言,21世纪的C语言,比起解释语言性能更高。拥有脚本化的语法,有着perl、Python一样简洁的语法。支持多种函数式和面向对象。其原生支持并发编程,不使用三方库,优胜于C C++的Glibc。Go 语言对网络通信、并发和并行编程的支持度极高,从而可以更好地利用大量的分布式和多核的计算机,他是计算机多核后的产物,充分利用计算机多核。开发者可以通...
GO的基础语法之变量(第七天) Go 语言的基础组成有以下几个部分:包声明引入包函数变量语句 & 表达式注释行分隔符在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。--------简洁性fmt.Println(“Hello, World!”)注释注释不会被编译,以 // 开头的单行注释。多行注释也叫块注...
GO语言之linux下环境搭建(第六天) linux 下环境搭建相当简单方便,只要解压缩GO 的压缩包即可tar xvf go1.10.3.linux-amd64.tar.gzGOROOT就是go的安装路径,在~/.bash_profile或者/etc/profile中添加export GOROOT=/home/liusenlin/goexport PATH=$PATH:$GOROOT/bin之后执行source /etc...
GO代码如何建立基本工程目录(第五天) Go语言开发环境要设置环境变量 GOPATH,构建一个项目,就需要将这个项目的目录添加到 GOPATH 中,多个项目之间可以使用;分隔目录结构一个Go语言项目的目录一般包含以下三个子目录:src 目录:放置项目和库的源文件;pkg 目录:放置编译后生成的包/库的归档文件;bin 目录:放置编译后生成的可执行文件src 目录用于以包(package)的形式组织并存放 Go 源文件,这...
GO语言环境搭建以及第一个程序(第三天) 环境搭建安装go语言开发包什么是go语言开发包?其实是对go语言的一种实现,包括相应版本的语法、编译、运行、垃圾回收等,里面包含着开发go所需的标准库、运行时以及其他的一些必要资源如何安装?(1)打开go开发包下载页:https://golang.org/dl/或者https://golang.google.cn/dl/如下,点击对应的安装环境,Linux win64都有。安装编...
GO语言学习规划(第二天) 前言: 最近学习GO语言,因为一直是LinuxC/C++开发,对C的语法熟悉,所以对于GO的语法还是有自信的,我是初识GO语言,所以就先了解哈大概。整体计划:1.买书,《Go语言高级编程》,《分布式对象存储–原理、架构、以及GO语言实现》。2.收集视频资料,买了一些培训班视频资料。3.坚持写博客,从基础开始,并且列下学习大纲。学习目标:专技术:GO原理,解决各种需求。懂框架:不同...
初识GO语言(第一天) GO语言介绍Go(又称Golang)语言是Google公司开发的一种静态型、编译型并自带垃圾回收和高并发的编程语言。2019年最值得学习的语言TOP3的GO语言,并且预计以后后台服务器很可能就是GO语言,目前有一些大公司在招聘GO语言开发工程师。官网:https://golang.org/历史概要:(1)于2007年9月由罗伯特·格瑞史莫,罗勃·派克(Rob Pike)及肯·汤普逊开始设...
Linux线程栈空间内存从glibc源码分析 1.何为线程栈空间泄露? 2. 何为anon内存? 3. 虚拟内存、物理内存、anon内存的联系 4. anon与线程的联系 5. glibc源码库线程创建与销毁anon关系 6. 使用pmap分析虚拟地址空间以及anon内存
(杂谈)防御网络欺骗,欢迎补充!!! 晚上在宿舍看到老师转发的一个视频很是震惊,链接https://m.v.qq.com/x/page/i/m/z/i0340c4l6mz.html?coverid=&ptag=4_5.2.2.17021_wxq&from=timeline 接下来就常见的互联网欺诈手段进行整理,需提高意识。 本文只是对案例进行简单概述,详情百度,对一些常见的安全防范进行提及,就当将就了解,不涉及纯技术
EOF #include#includeusing namespace std;int main(){ char c = 0; while((c = getchar()) != EOF) { putchar(c); } }它是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(std
一些输出函数小结(putchar puts fputs ) 1. putchar函数的格式:putchar(ch) 其中ch可以是一个字符变量或常量,也可以是一个转义字符。2.putchar函数的作用:向终端输出一个字符。(1)putchar函数只能用于单个字符的输出,且一次只能输出一个字符。(2)在程序中使用putchar函数,务必牢记:在程序(或文件)的开头加上编译预处理命令(也称包含命令),即:#includ
一些读取字符函数小结(getchar getch getche) getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab) 是stdio.h中的库函,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取了,第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了 从stdi
一些常见的运算符重载 #include#include#include#include#includeusing namespace std;class my_complex{public:void * operator new(size_t size){ void *p = (void *)malloc(size); if(NULL != p) { cout <
C++一些常见的运算符重载 #include#includeusing namespace std;class my_complex{public: my_complex& operator ++ ();//前置++ my_complex& operator ++ (int);//后置++public: //单目运算符重载
C++中的new的用法 关于c++ new操作符的重载你知道c++ 的new 操作符和operator new 的区别么?也许你还会问,他们有区别吗? 当你写下面这样的代码时,string *pa = new string("memory managerment");你使用的是new 操作符,这个操作符和sizeof 一样,是c++ 语言级别支持的。你不能改变它的语义,它做的事情总是不变的:分
C++ 运算符理论小结 c++的一大特性就是重载(overload),通过重载可以把功能相似的几个函数合为一个,使得程序更加简洁、高效。在c++中不止函数可以重载,运算符也可以重载。由于一般数据类型间的运算符没有重载的必要,所以运算符重载主要是面向对象之间的。1.一般运算符重载在进行对象之间的运算时,程序会调用与运算符相对应的函数进行处理,所以运算符重载有两种方式:成员函数和友元函数。成员函数的形
C++ 中的运算符重载 #include#includeusing namespace std;class my_complex{public: //关系运算符重载 bool operator == (const A& ); bool operator != (const A& ); bool operator < (c
后缀式 即逆波兰式。逆波兰式是波兰逻辑学家卢卡西维奇(Lukasiewicz)发明的一种表示表达式的方法。这种表示方式把运算符写在运算对象的后面,例如,把a+b写成ab+,所以也称为后缀式。这种表示法的优点是根据运算对象和算符的出现次序进行计算,不需要使用括号,也便于用械实现求值。对于表达式x:=(a+b)*(c+d),其后缀式为xab+cd+*:=。原表达式:a*(b*(c+d/e)-f
C++中的容器小结 C++中的容器类包括“顺序存储结构”和“关联存储结构”,前者包括vector,list,deque等;后者包括set,map,multiset,multimap等。若需要存储的元素数在编译器间就可以确定,可以使用数组来存储,否则,就需要用到容器类了。1、vector 连续存储结构,每个元素在内存上是连续的; 支持高效的随机访问和在尾端插入/删除操作,但其
查找算法的小结 顺序查找算法====================1. 算法描述 顺序比较即可。2. 平均查找长度 (n+1)/2, 其中n为表长。 3. 算法实现 省略 4. 优化思想 根据经验,目前被查到越多的元素,将来可能被查到的可能性也越大。所以可以考虑,每次查找到一个元素后,将它和直接前驱交换位置。如果上述的经验从概率上来讲是成立
http状态码 HTTP 状态代码 错误列表如果向您的服务器发出了某项请求要求显示您网站上的某个网页(例如,当用户通过浏览器访问您的网页或在 Googlebot 抓取该网页时),那么,您的服务器会返回 HTTP 状态代码以响应该请求。此状态代码提供了有关请求状态的信息,且为 Googlebot 提供了有关您网站和请求的网页的信息。一些常见的状态代码为:200 - 服务器成功返回网页
TCP/IP连接状态变迁图CLOSE_WAIT 本文转自:http://blog.csdn.net/yusiguyuan/article/details/21445945#1536434-tsina-1-25592-66a1f5d8f89e9ad52626f6f40fdeadaa终止一个连接要经过4次握手。这由TCP的半关闭(half-close)造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独
错题整理之网络(二) 应用程序PING 发出的是什么报文正确答案: C 你的答案: C (正确)TCP 请求报文TCP 应答报文ICMP 请求报文ICMP 应答报文 Ping程序的实现 1 实现方法是主机向远程计算机发出ICMP回显请求以后,远程计算机会拦截这个请求,然后生成一条一条回显应答信息
ip 子网数目 网络号 主机号 广播地址 可用IP地址范围 一般考试中都会给定一个IP地址和对应的子网掩码,让你计算 1、子网数目 2、网络号 3、主机号 4、广播地址 5、可用IP地址范围 综合实例: 已知172.31.128.255/18,试计算: 1、子网数目, 2、网络号, 3、主机号, 4、广播地址, 5、可分配IP的起止范围 解: 1、算子网数目 首先将/18换
网络有关笔试题 数据分段在OSI哪一层( )传输层数据分段是在传输层中完成的,传输层定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。主要是将从下层接收的数据进行分段和传输,到达
Linux进程退出码 #include int main(void) { return -1; } 编译好,然后运行,然后在shell里面查看进程退出码,键入:echo $?,我们发现拿到的进程退出码是255。我们返回的明明是-1,为什么拿到的却是255呢?还得从进程的状态码开始讲起,我们知道,当一个进程退出的时候,父进程一般都会进行收尾工作,就是调用wait或者w
Linux进程间通信之——管道(整理) 进程间通信 fork pipe pie_t 等用法(管道机制 通信)每个进程各自有不同的用户地址空间,任 何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。如下图所
僵尸进程 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程…一个
操作系统自举后做了什么??? 前段时间在看清华大学出版社出版的《Linux教程》(05年6月第一版)。在248页第十三章《进程》有一节是简述Linux进程的层次关系的,把操作系统自启动后都做了什么,说得比较清晰,看过后受益匪浅。 就是喜欢看这种能把整个框架说得比较清楚的文章!特抄来以共享: 当打开Linux系统,LILO(LInux LOader)找到Linux内核把它加载到内存。它初始化各种硬件,
fork()与vfork()的区别 fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别: 1. fork ():子进程拷贝父进程的数据段,代码段 vfork ( ):子进程与父进程共享数据段 2. fork ()父子进程的执行次序不确定 vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec 或e
Linux之写时复制技术 写入时复制(Copy-on-write)是一个被使用在程式设计领域的最佳化策略。其基础的观念是,如果有多个呼叫者(callers)同时要求相同资源,他们会共同取得相同的指标指向相同的资源,直到某个呼叫者(caller)尝试修改资源时,系统才会真正复制一个副本(private copy)给该呼叫者,以避免被修改的资源被直接察觉到,这过程对其他的呼叫只都是通透的(transparent
进程的调度算法 抢占式 多任务 分时前面我们已经明确了调度可能发生的时机,现在我们通过这些调度时机来理清下现代操作系统中这几个重要的概念。1.多任务在单任务系统中,一个进程即使发生I/O阻塞(比如等待用户输入)时,操作系统也不会执行另一进程,整个系统都将陷入等待的空闲中。而多任务就是指当一个正在执行的进程发生I/O阻塞或等待其他资源需要暂停时,操
Linux基于流IO 基于流的I/O操作 流的打开函数:(1) FILE *fopen(const char *pathname,const char *type); (2) FILE *freopen(const char *pathname,const char *type, FILE *fp); (3) FILE *fdopen(int filede
Linux网络编程之IO模型 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回
Linux文件描述符(转) 转载请说明出处:http://blog.csdn.net/cywosp/article/details/389652391. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的
Linux系统调用接口(转) 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完全也是很罕见的。 按照惯例,这个列表以man pages第2节,即系统调用节为蓝本。按照笔者的理解,对其作了大致的分类,同时也作了一些小小的修改,删去了几个仅供内核使
Linux的设备 1.字符设备(char device)字符设备是Linux最简单的设备,可以像文件一样访问。初始化字符设备时,它的设备驱动程序向Linux登记,并在字符设备向量表中增加一个device_struct数据结构条目,这个设备的主设备标识符用做这个向量表的索引。一个设备的主设备标识符是固定的。chrdevs向量表中的每一个条目,一个device_struct数据结构,包括两个元素:一个登记设备驱动程
Linux系统目录(转) 1、Linux文件系统的层次结构 在Linux或Unix操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构。 文件系统的最顶层是由根目录开始的,系统使用”/“来表示根目录。在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件。如此反复就可以构成一个庞大的文件系统。 在Linux文件系统中有两个特
Linux的文件类型分类 Linux文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具... .... 或 cp工具等。linux文件的删除方式是用rm 命令。Linux文件类型;Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的比如file.txt、file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在Linux文件类型中衡量的话
Linux的文件系统(转) linux文件系统简介Linux下一切皆文件 linux的文件系统,主要包括了linux磁盘分区和目录、挂载基本原理、文件存储结构、软链接硬链接、和常见目录的介绍。 如有不对之处请大家多多指出。1.Linux磁盘分区和目录 Linux发行版本之间的差别很少,差别主要表现在系统管理的特色工具以及软件包管理方式的不同。目录结构基本上都是一样的。 Win
C++中的虚函数表(转) 假设我们有这样的一个类: class Base { public: virtual void f() { cout "Base::f" << endl; } virtual void g() { cout "Base::g" << endl; } virtual void h()
C++中的多态一 多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。多态(polymorphism),字面意思多种形状。在C++中有两种多态性 : 1.编译时的多态性-----通过函数的重载和运算符的重载来实现的 2.运行时的多态性-----运行时的多态性是指在程序执行前,无法根据函数名和参数来确定该调用哪
C++中的虚拟继承(二)【转】 http://blog.csdn.net/wangxingbao4227/article/details/6772579C++中虚拟继承的概念为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避
C++中的虚基类 虚基类共同基类设置为虚基类,这样从不同路径继承来的同名数据成员在内存中就只有一个拷贝,同名函数也只有一种映射虚基类(virtual base class)定义方式如下:class 派生类名:virtual 访问限定符 基类类名{...};class 派生类名:访问限定符 virtual 基类类名{...};virtual 关键字只对紧随其后的基类名起作用
C++ 继承(三) C++中,比较类的三种继承方式:共有继承、受保护继承、私有继承之间的区别在三种不同方式的继承下,派生类对原来基类中的成员访问的方式也不一样,具体如下: 1>公有继承中: (1)基类的共有成员就相当于是派生类的公有成员,也就是说派生类可以像访问自身公有成员一样访问从基类继承的公有成员。 (2)基类的保护成员就相当于是派生类的保护成员,即,派生类可以像访问自
C++中的继承(二) 一、基本概念1、类的继承,是新的类从已有类那里得到已有的特性。或从已有类产生新类的过程就是类的派生。原有的类称为基类或父类,产生的新类称为派生类或子类。 2、派生类的声明:class 派生类名:继承方式 基类名1, 继承方式 基类名2,...,继承方式 基类名n{ 派生类成员声明;}; 3、一个派生类可以同时有多个基类,这种情况称为多重继承,派生类
C++中的继承(一) 继承(inheritance)机制 是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构。体现了由简单到复杂的认识过程。 思想: 从现有的类继承属性和行为,然后增加属性和行为定制类以满足我们的实际要求,创建派生类不会英系那个基类的
volatile volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.简单地说就是防止编译器对代码进行优化.比如如下程序:1234XBYTE[2]=0x55;XBYTE[2]=0x56;XBYTE[2]=0x57;XBYTE[2]=0x58;
一道题说明笔试的陷阱 写一个函数,完成内存移动(拷贝),并为其写一个简单的测试用例来进行测试。 程序清单 1 V0.1版程序void MyMemMove(char *dst,char *src,int count){ while(count--) { *dst++ = *src++; }} 程序清单 2 测试用例void Tes
宏和内联函数的小结 内联函数和宏 宏定义是C语言提出的,它在预处理的地方将代码展开,这样做,相比于函数调用,可减少额外的时间和空间开销。 但是宏定义有一些缺点,最明显的是,它容易产生二义性。如:#define MAX(a, b) a>b?a:b 使用该宏: MAX( num1, num2 ,因为宏展开后变成 num1>num2 ?num1:num2,但是,如果是这样调用的:MAX( 17+32, 25+21)
软链接与硬链接的小结(转) 对于一个文件来说,有唯一的索引接点(inode)与之对应,而对于一个索引接点号,却可以有多个文件名与之对应。因此,在磁盘上的同一个文件可以通过不同的路径去访问该文件。注意在Linux下是一切皆文件的啊,文件夹、新加的硬盘 ...都可以看着文件来处理的啊。 连接有软连接和硬连接(hard link)之分的,软连接(symbolic link)又叫符号连接。符号连接相当于Window
Linux下常见的系统命令小结(转) grep命令该命令常用于分析一行的信息,若当中有我们所需要的信息,就将该行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工等等,它的简单语法为[plain] view plain copy print?grep [-acinv] [--color=auto] '查找字符串' filename 它的常用
Linux下制作动态库与静态库 静态函数库: 1.这类库的名字一般是libxxx.a; 2.利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进可执行文件了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译,而且体积也较大动态函数库: 这类库的
哈夫曼树(理论篇) 与哈夫曼树有关的概念: 路径: 树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。 路径长度:路径上的分枝数目称作路径长度。 树的路径长度:从树根到每一个结点的路径长度之和。 结点的带权路径长度:在一棵树中,如果其结点上附带有一个权值,通常把该结点的路径长度与该结点上的权值
二叉树(理论篇) 二叉树: 二叉树是每个节点最多有两个子树的树结构1.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),2.二叉树的子树有左右之分,次序不能颠倒。3.二叉树的第i层至多有2^(i-1)个结点;深度为k的二叉树至多有2^k-1个结点;4.对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。满二叉
树(理论篇) 节点的度: 一个节点含有的子树的个数称为该节点的度双亲节点或父节点: 若一个节点含有子节点,则这个节点称为其子节点的父节点孩子节点或子节点: 一个节点含有的子树的根节点称为该节点的子节点兄弟节点: 具有相同父节点的节点互称为兄弟节点树的度: 一棵树中,最大的节点的
进程的状态 进程三态状态装换图 就绪态只需要等待处理机(CPU)阻塞态可能在等待输入输出,即使分配给处理机也是徒劳调度进程,只需要等待就绪队列里的进程,因为阻塞状态可以转换到就绪队列里去就绪原因: 缺少cpu 阻塞原因 1.内存资源紧张2. 无就绪队列,处理机空闲3 .I/O速度比处理机速度慢的多,可能出现全部进程
操作系统调度算法(上) 操作系统的分类:(按环境分):批处理操作系统: 又分为: 1.单通道批处理系统:如dos,用户一次可以提交多个作业,但系统一次只处理 一个作业,处理完一个作业后再调入下一个作业进行处理。这些调度、切换系 统自动完成。不需人工干预 2.多通道批处理系统:同一个
判断两链表是否相交 1.判断链表带不带环 2.如果都不带环,就判断尾节点是否相等 3.如果都带环,判断一条链表上两指针相遇的那个节点, 在不在另一条链表上,如果在,则相交,如果不在,则不相交那么如何判断是否带环? 设置两个指针 p1 、p2 开始都指向链表的头, p2 每次移动两步 p1每次移动一步,如果存在环,则他们必在环中相遇#include<iostream>#include<s
求链表倒数第k个节点 公共头文件unp.h#include<unistd.h>#include<stdio.h>#include<string.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<pthread.h>#define SERVER_IP "127.0.0.1"#define SERVER_P
strtok()函数的实现 小结字符串处理函数: 1.注意字符串的特征,末尾’\0’ 2.遍历是最常见的,如果一个字符串中查询另一个 一定要分清谁在前后的问题strtok函数对于字符串的切割,很好用的。 分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。作用于字符串s,以包含在deli
strbrk()函数的设计 #include<iostream>#include<stdio.h>#include<assert.h>char *my_strbrk(const char *src1,const char *src2);char *my_strbrk(const char *src1,const char *src2){ assert(src1 != NULL && src2 != NULL);
strdup()函数实现 #include<iostream>#include<stdio.h>#include<assert.h>char * my_strdup(char *src);char *my_strdup(char *src){ if(NULL == src) { return NULL; } char *p_src = NULL; p_src =
strcat()和strncat()函数的实现 #include<iostream>#include<stdio.h>#include<assert.h>char *my_strcat( char *des,const char *src); char *my_strcat( char *des,const char *src){ assert(des != NULL || src != NULL); char *ad
阿里内推电话面试一面小结 1.请介绍一下自己2.你做过哪些项目?为啥要做这个项目?能详细介绍一下吗? 问你做这个多长时间 你为啥要做这个 还有问了一个问题,就是注释转换中,如果有 #if 0 //liusenlin1/
编写类似strcmp() strncmp()函数 #include<iostream>#include<stdio.h>#include<assert.h>int my_strcmp(const char *str1,const char str2); int my_strcmp( const char *str1,const char *str2){ assert(str1 != NULL || str1 != NULL