自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [Linux]System V 信号量

目录介绍原理创建/打开信号集操作信号量集(原子操作)控制信号量集介绍为了防止出现因多个进程同时访问一个共享资源引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。信号量就可以提供这样的一种访问机制,确保多个线程在对共享内存这样的共享资源同时读写时,使之实现同步与互斥,也就是说信号量用来调协进程对公共资源的访问的。信号量本质上是一...

2019-10-27 15:57:51 243

原创 [Linux]System V 消息队列

目录信号量是用来调协进程对共享资源的访问的。

2019-10-24 13:56:33 181

原创 [Linux]System V 共享内存

目录System V 共享内存创建共享内存建立映射关系解除映射控制共享内存关于函数ftokSystem V 共享内存共享内存就是将同一块物理内存映射到不同进程虚拟内存的共享区域,实现两个进程间通信。一旦这样的内存映射到进程地址空间的共享区,这些进程间数据传递不再涉及到内核,不再通过执行进入内核的系统调用来传递彼此的数据,所以说共享内存是最快的IPC形式。我们可以通过命令查看/删除系统中已有的...

2019-10-21 17:13:11 214

原创 [Linux]进程间通信=>管道

目录介绍匿名管道命名管道管道读写规则从内核看管道介绍每个进程各自有不同的用户地址空间,都是独立运行,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程把数据从用户空间拷到内核缓冲区,另一个进程再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。我们常用 ‘|’ 符号来用一个命令来处理另一个命令的显示结果cat test.c |less这个过程本质上是创建cat进程传...

2019-10-20 20:54:04 158

原创 [Linux]进程替换

当进程调用exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序开始执行。调用exec并不创建新进程,调用前后进程id并未改变。系统调用:int execve(const char* path, char* const argv[], char* const envp[]);库函数:int execl(const char *path, const char *arg, .....

2019-10-19 13:24:15 161

原创 [Linux]进程终止与wait参数status

目录常见进程退出方法常见进程等待方法wait参数status到底有啥东西常见进程退出方法exit或_exit退出_exit系统调用函数:void _exit(int status);参数status定义了进程的终止状态,父进程通过wait获取该值。虽然status是int,但是仅有低8位可以被父进程所用,实际上就是子进程的返回值。exit库函数:void exit(int statu...

2019-10-18 10:43:39 1653

原创 [Linux]僵尸进程与孤儿进程详解

目录僵尸进程观察一个僵尸进程僵尸进程的危害孤儿进程观察一个孤儿进程总结如何解决/避免僵尸进程僵尸进程linux中,正常情况下,子进程和父进程是一个异步过程,父进程永远无法预测子进程 到底什么时候结束。 当一个进程完成它的工作终止之后,它的父进程需要调用wait系列系统调用取得子进程的终止状态。如果子进程退出,而父进程并没有调用wait获取子进程的状态信息,那么子进程的task_struct结构...

2019-10-17 21:02:38 220

原创 [Linux]理清fork、vfork、clone、system、popen

目录pid_t fork(void);子进程返回0,父进程返回子进程pid,出错返回-1

2019-10-13 23:46:09 549

原创 [Linux]详解main函数的三个参数

目录argc与argvenv常见的环境变量环境变量相关命令通过代码查看环境变量./main执行和main执行是否应该使用第三个参数envC程序总是从main函数开始执行的,main函数的原型是:int main(int argc, char* argv[], char* env[])argc与argvargc表示传入main函数的参数个数;argv[]表示传入main函数的参数序列或指针...

2019-10-09 14:53:07 1459

原创 [Linux]进程基础

进程是程序执行时的一个实例,可以分配给处理器并由处理器执行的一个实体,是由单一顺序的执行显示,是一个当前状态和一组相关的系统资源描述的活动单元...

2019-10-08 23:58:02 116

原创 [Linux]基本体系结构

Linux的体系结构一个完整的操作系统由内核、命令解释层、文件系统等部分组成内核执行最底层的任务,保证系统正常运行,协调多个并发进程,管理进程内存。主要组成模块:文件系统驱动模块硬件设备驱动模块内存管理模块进程管理模块网络管理模块命令解释层用户和内核交流的媒介,接收并解析用户的命令,然后将其送入内核执行,每个用户都可以有自己的用户界面或者shell用来满足自己专门的sh...

2019-10-03 22:56:52 1983

原创 [C++]智能指针

目录new/delete操作符定位new表达式设计一个只能在堆上创建对象的类设计一个只能在栈上创建对象的类关于内存泄漏new/delete操作符操作:new data-type;data-type可以是包括数组在内的任意内置类型数据,也可以是自定义的任何数据类型如:int* p = new int(3); delete p;在堆上申请空间,创建对象int并初始化为3int* p = n...

2019-09-13 23:17:36 116

原创 [C++]多态总结

目录多态的定义多态的构成条件虚函数的重写C++11: override和final抽象类多态的原理虚函数表多继承中的虚函数表为什么达到多态必须父类对象的指针或引用调用虚函数打印虚函数表多继承子类虚函数表访问方法多态的定义多态的构成条件必须通过父类的指针或者引用调用虚函数被调用的函数必须是虚函数,且子类必须对父类的虚函数进行重写虚函数的重写子类中有一个跟父类完全相同的虚函数(返回值类...

2019-09-08 23:38:31 154

原创 [C++]继承总结

目录继承方式基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数C++11: final继承与友元、静态虚拟继承继承继承与组合继承机制是代码复用重要的手段,允许在保持原有类特性的基础上进行扩展,产生子类继承方式public继承:继承父类中的public和protected成员,访问限定符不变private继承:继承父类中的public和protected成员,访问限定符变为priva...

2019-09-03 23:00:17 170

原创 [C++]模板总结

目录定义实例化非类型模板参数模板参数的匹配原则函数模板特化类模板类模板特化类型萃取模板分离编译总结定义template开始,后跟一个模板参数列表(在模板定义中,模板参数列表不能为空)typename是用来定义模板参数关键字(C++98之后),也可以 使用class(切记:不能使用struct代替class)实例化隐式实例化:让编译器根据实参推演模板参数的实际类型,编译器一般不会进行类型转...

2019-08-13 13:16:30 139

原创 [C++]类和对象总结

目录定义方式类的访问限定符及封装类对象模型构造函数使用构造函数默认构造函数初始化列表C++11 成员初始化新玩法单参构造拷贝构造函数析构函数运算符重载this指针对象数组C++11 列表初始化const成员函数static成员友元友元函数友元类内部类C语言中结构体中只能定义变量,C++中结构体内不仅可以定义变量,也可以定义函数,C++中更喜欢用class来代替。区别是struct的成员默认访问方...

2019-08-08 23:13:01 263

原创 [C++]函数总结

目录内联函数引用变量临时变量C++11 右值引用引用和指针默认参数函数重载注意事项重载引用/指针参数原理内联函数编译时,编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率,但是占用更多内存。当执行函数代码时间比处理函数调用机制时间长时,则节省的时间比例不高,不必声明为内联。当函数代码少,并且函数经常被调用,声明为内联可以提升程序运行效率。inline对于编译...

2019-08-03 18:03:17 245

原创 [C++]名称空间

目录传统C++名称空间声明区域:潜在作用域和作用域:新的名称空间特性定义使用最佳实践C++中,名称可以是变量、函数、结构、枚举、类、以及类和结构的成员。使用名称空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。传统C++名称空间声明区域:声明区域是可以在其中进行声明的区域。例如,全局变量的声明区域为其声明所在的文件;自动变量的声明区域为其声明所在的代码块。潜在作用域和作用域...

2019-08-01 12:06:01 389

原创 [C]预处理和宏定义总结

目录C预处理预定义宏#define参数化的宏#与##宏和函数命令行定义C预处理C预处理器不是编译器的组成部分,它是编译过程中一个单独的步骤。本质上是一个文本替换工具所有预处理器命令都是#开头,预处理指令不是语句,所以它们不会以分号结尾。预处理:选项 gcc -E test.c -o test.i 预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。常见指令:#defi...

2019-07-16 18:03:01 204

原创 [C]文件基本操作总结

目录文件的打开和关闭fopenfclose文件的顺序读写文件的随机读写fseekftellrewind文件结束判定文件出错判定文件缓冲区字符串和数字之间的转换方式一般我们说的文件有两种:程序文件:源程序文件(后缀为.c);目标文件(windows环境后缀为.obj);可执行程序(windows环境后缀为.exe)数据文件:文本文件=>以ASCII字符的形式存储的文件二进制文件=&...

2019-07-07 00:00:01 206

原创 [C]自定义类型总结

目录内存对齐内存对齐的意义修改默认对齐数位段位段的跨平台问题柔性数组柔性数组的特点枚举联合(共用体)一个有趣的问题内存对齐第一个成员在与结构体变量偏移量为0的地址处。其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数=编译器默认的一个对齐数与该成员大小的较小值。 VS中默认的值为8,Linux中的默认值为4结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。如果...

2019-07-06 00:33:06 264

原创 [C/C++]内存管理

目录初始化变量C/C++程序的内存开辟1.栈2.堆3.数据段(静态区)4.代码段函数的入口校验动态内存函数1.malloc2.free3.calloc4.realloc初始化变量在定义一个变量时,第一件事就是初始化,但是往往这个时候我们还不确定这个变量的初值,这样的话可以初始化为0或NULL,用完指针之后也将指针变量的值设置为NULL。如果定义的是数组的话,可以这样初始化:int a[10]...

2019-07-03 12:06:17 139

原创 [C]函数指针

目录定义调用的方式两段有意思的代码应用场景1. 回调函数:2. 表驱动(转移表):定义函数指针就是指向函数的指针,其值就是函数体的首地址。在底层,函数名就代表函数的首地址,所以把函数名直接指派给一个同类型的函数指针而不需要&运算符,可以直接用函数名注册回调函数。int(*fp)(const char *)=strlen;调用的方式有两种:int len = fp("hehe"...

2019-06-28 18:30:01 172

原创 [C]指针的艺术

指针是C语言的精髓,正是指针使C威力无穷,下面是我学习过程中总结的一些指针相关内容,持续更新中;目录指针的本质定义指针类型的注意事项指针有实际意义的运算字符指针的误区指针的本质可执行程序是由指令、数据和地址组成的。当CPU访问内存单元时,必须把内存单元的地址加载到地址总线上,同时将内存电路的“读写控制”设置为有效,然后内存单元中的数据就通过数据总线流向了接受寄存器中,或者结果寄存器中的值流向...

2019-06-18 12:38:37 180

原创 [C]数组深入探究

目录数组的本质数组名数组初始化关于下标越界二维数组多维数组数组和指针之间的等价关系数组传递数组的动态创建数组的本质任何数组的元素在内存中都是连续字节存放的,数组下标必须是整数或整数表达式,并且下标操作符返回的是一个元素的引用:int arr[10] = { 0 };arr[3] = 1; // 编译器计算地址arr+3*sizeof(int),并且返回该地址的引用,和下边两句是语义上等价...

2019-06-02 12:33:00 147

原创 [C]类型提升详解

整型提升表达式的运算要在CPU内执行,CPU内整型运算器的操作数的字节长度一般是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时也要先转换为CPU内整型操作数的标准长度。通用CPU是难以直接实现两个8比特字节直接相加运算所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算...

2019-05-22 15:03:00 1584

原创 [C]浮点数详解

IEEE 754规定任意一个二进制浮点数V可以表示成下面的形式:V=(−1)S×M×2EV=(-1)^S × M × 2^EV=(−1)S×M×2E例如下图是32位单精度浮点数存储模型其中S表示符号位,当S=0,V为正数;当S=1,V为负数。​M表示有效数字,1≤M<2(规约形式)E表示指数位。eg:十进制的6.125,用拈加法写成二进制是110.001,等价于1.10001...

2019-05-21 13:33:33 2194

原创 [C++]C++11零碎特性总结

auto关键字C++11中,auto全新的含义:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。使用auto时必须进行初始化,编译阶段需根据初始化表达式来推导auto的实际类型auto是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型用auto声明指针类型时,用auto和auto*没有任...

2019-09-18 13:07:30 110

原创 [C]字符函数和字符串函数

如果要更好的运用C语言中的一些库函数,那么模拟它的实现过程是必不可少的,在此我总结一些常用的库函数的模拟实现:目录字符串相关函数1.模拟实现strlen函数2.模拟实现strcpy函数3.模拟实现strcat函数4.模拟实现strcmp函数字符串查找函数1.模拟实现strstr函数2.模拟实现strtok函数内存操作函数1.模拟实现memcpy函数2.模拟实现memmove函数字符串相关函数...

2019-07-01 23:00:00 129

原创 [C]指针与数组相关面试题

前几篇博客提到了指针和数组的本质,所以这篇博客讨论有关面试题,其中有些是必须掌握的知识,有些是面试常考,还有些纯属好玩~~目录数组面试题关于二维数组的详细理解总结指针面试题总结数组面试题//对于整数char c = 1;printf("%d\n", sizeof(c)); // 1,c为char类型,一个字节printf("%d\n", sizeof(c + 0)); // 4...

2019-06-30 18:06:01 204

原创 [C]大小端存储模式判断方法

大端存储模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;小端存储模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。如何判断// 方法一int IsLittleEnd1() {...

2019-05-26 23:38:18 246

原创 [C]位运算技巧以及常见题型总结

目录1. 给定一个数,将某一位设置为1或者02. 给定一个整数num,求这个整数中二进制位1的个数3. 利用异或操作实现交换变量a、b4. 使用位运算求(a + b) / 25. 一组数据中只有一个数字出现了一次,其他所有数字都是成对出现的。请找出这个数字(使用位运算)6. 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个数字(使用位运算)1. 给定一个数,将某一位设置为1...

2019-05-25 23:03:21 687

原创 [C]转义字符的探究

转义字符顾名思义就是转变意思的字符有这样一组代码printf("%lu\n", strlen("\377")); // 1printf("%lu\n", strlen("\378")); // 2printf("%lu\n", strlen("\387")); // 3printf("%lu\n", strlen("\0377")); // 2printf("%lu\n", st...

2019-05-20 23:06:37 397

空空如也

空空如也

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

TA关注的人

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