02 2023 档案

摘要:lambda 表达式可以说是 c++11 引用的最重要的特性之一, 它定义了一个匿名函数, 可以捕获一定范围的变量在函数内部使用 语法如下: auto func = [capture] (params) opt -> ret { func_body; }; 参数: func:lambda表达式的名字 阅读全文
posted @ 2023-02-23 11:34 小秦同学在上学 阅读(36) 评论(0) 推荐(0) 编辑
摘要:原理: 智能指针是一个类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。 动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源 所以智能指针不用手动去释放内存 常用的智能指针: 1、shared_ptr: 实现原理:采用引用计数器的方法 阅读全文
posted @ 2023-02-23 11:04 小秦同学在上学 阅读(74) 评论(0) 推荐(0) 编辑
摘要:1、auto 让编译器通过初始值来进行类型推演 所以说 auto 定义的变量必须有初始值 使用过程 //普通;类型 int a = 1, b = 3; auto c = a + b;// c为int型 //const类型 const int i = 5; auto j = i; // 变量i是顶层c 阅读全文
posted @ 2023-02-23 10:20 小秦同学在上学 阅读(54) 评论(0) 推荐(0) 编辑
摘要:C++中NULL和nullptr区别? NULL来自C语言,一般由宏定义实现,而 nullptr 则是C++11的新增关键字。 在C语言中,NULL被定义为(void*)0,而在C++语言中,NULL则被定义为整数0,如下定义: #ifdef __cplusplus #define NULL 0 # 阅读全文
posted @ 2023-02-23 10:10 小秦同学在上学 阅读(70) 评论(0) 推荐(0) 编辑
摘要:C++ 11有哪些新特性? nullptr替代 NULL 引入了 auto 和 decltype 这两个关键字实现了类型推导 基于范围的 for 循环for(auto& i : res){} 类和结构体的中初始化列表 Lambda 表达式(匿名函数) std::forward_list(单向链表) 阅读全文
posted @ 2023-02-23 10:03 小秦同学在上学 阅读(14) 评论(0) 推荐(0) 编辑
摘要:为什么C++没有垃圾回收机制?这点跟Java不太一样。 实现一个垃圾回收器会带来额外的空间和时间开销 需要开辟一定的空间保存指针的引用计数和对他们进行标记mark 然后需要单独开辟一个线程在空闲的时候进行free操作 垃圾回收会使得C++不适合进行很多底层的操作。 阅读全文
posted @ 2023-02-22 11:49 小秦同学在上学 阅读(19) 评论(0) 推荐(0) 编辑
摘要:什么是友元 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员 尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。 友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员 阅读全文
posted @ 2023-02-22 11:40 小秦同学在上学 阅读(76) 评论(0) 推荐(0) 编辑
摘要:你知道回调函数吗?它的作用? 最重要作用就是解耦 当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数; 回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用。你需要做三件事:1,声明;2,定义;3,设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便 阅读全文
posted @ 2023-02-22 11:26 小秦同学在上学 阅读(23) 评论(0) 推荐(0) 编辑
摘要:*成员函数里memset(this,0,sizeof(this))会发生什么 void *memset(void *str, int c, size_t n) - 参数 - str -- 指向要填充的内存块。 - c -- 要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无 阅读全文
posted @ 2023-02-22 11:22 小秦同学在上学 阅读(161) 评论(0) 推荐(0) 编辑
摘要:string 是c++标准库里面其中一个,封装了对字符串的操作,实际操作过程我们可以用const char*给string类初始化 a) string转const char* string s = “abc”; const char* c_s = s.c_str(); b) const char* 阅读全文
posted @ 2023-02-22 10:39 小秦同学在上学 阅读(181) 评论(0) 推荐(0) 编辑
摘要:C++中标准库是什么? C++ 标准库可以分为两部分: 标准函数库:由通用的、独立的、不属于任何类的函数组成的。函数库继承自 C 语言。 面向对象类库: 这个库是类及其相关函数的集合 输入/输出 I/O、字符串和字符处理、数学、时间、日期和本地化、动态分配、其他、宽字符函数 标准的 C++ I/O 阅读全文
posted @ 2023-02-22 10:36 小秦同学在上学 阅读(25) 评论(0) 推荐(0) 编辑
摘要:如果有一个空类,它会默认添加哪些函数? 1) Empty(); // 缺省构造函数// 2) Empty( const Empty& ); // 拷贝构造函数// 3) ~Empty(); // 析构函数// 4) Empty& operator=( const Empty& ); // 赋值运算符 阅读全文
posted @ 2023-02-22 10:35 小秦同学在上学 阅读(13) 评论(0) 推荐(0) 编辑
摘要:你知道strcpy和memcpy的区别是什么吗? char *strcpy(char *dest, const char *src) - 参数: - dest:指向用于存储复制内容的目标数组。 - src -- 要复制的字符串。 void *memcpy(void *str1, const void 阅读全文
posted @ 2023-02-22 10:31 小秦同学在上学 阅读(148) 评论(0) 推荐(0) 编辑
摘要:所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为。很多时候用户可能都不知道进行了哪些转换 C++面向对象的多态特性,就是通过父类的类型实现对子类的封装。 通过隐式转换,你可以直接将一个子类的对象使用父类的类型进行返回。 基本数据类型的转换以取值范围的作为转换基础 隐式转换发生在从小-> 阅读全文
posted @ 2023-02-22 10:27 小秦同学在上学 阅读(85) 评论(0) 推荐(0) 编辑
摘要:说一下你理解的 ifdef endif代表着什么? 一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见 阅读全文
posted @ 2023-02-22 10:23 小秦同学在上学 阅读(51) 评论(0) 推荐(0) 编辑
摘要:当程序中有函数重载时,函数的匹配原则和顺序是什么? 名字查找 确定候选函数 寻找最佳匹配 你知道重载运算符吗? 只能重载已有的运算符,而无权发明新的运算符 两种重载方式:成员运算符和非成员运算符 成员运算符比非成员运算符少一个参数 下标运算符、箭头运算符必须是成员运算符; 引入运算符重载,是为了实现 阅读全文
posted @ 2023-02-22 10:18 小秦同学在上学 阅读(16) 评论(0) 推荐(0) 编辑
摘要:cout和printf有什么区别? cout<<是一个函数,cout<<后可以跟不同的类型是因为cout<<已存在针对各种类型数据的重载,所以会自动识别数据的类型。 输出过程会首先将输出字符放入缓冲区,然后输出到屏幕。 cout是有缓冲输出 printf是行缓冲输出,不是无缓冲输出。 阅读全文
posted @ 2023-02-22 10:16 小秦同学在上学 阅读(124) 评论(0) 推荐(0) 编辑
摘要:1、什么是内存对齐 现代计算机中内存空间都是按照 byte 划分的 理论上讲似乎对任何类型的变量的访问可以从任何地址开始,实际的计算机系统对基本类型数据在内存中存放的位置有限制 会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐 2、为什么要进行内存对齐 处理器在取数 阅读全文
posted @ 2023-02-22 10:10 小秦同学在上学 阅读(35) 评论(0) 推荐(0) 编辑
摘要:知道C++中的组合吗?它与继承相比有什么优缺点吗? 继承: 继承是Is a 的关系 Student继承Person,则说明Student is a Person。 优点是子类可以重写父类的方法来方便地实现对父类的扩展。 缺点: 父类的内部细节对子类是可见的 子类从父类继承的方法在编译时就确定下来了, 阅读全文
posted @ 2023-02-22 09:42 小秦同学在上学 阅读(38) 评论(0) 推荐(0) 编辑
摘要:向上类型转换: 将派生类的对象赋值给基类的对象是可以的,其只不过是将派生类中基类的部分直接赋给基类的对象 将派生类指针或引用转换为基类的指针或引用被称为向上类型转换 向上类型转换会自动进行,而且向上类型转换是安全的 向下类型转换 将基类指针或引用转换为派生类指针或引用被称为向下类型转换 向下类型转换 阅读全文
posted @ 2023-02-21 15:17 小秦同学在上学 阅读(50) 评论(0) 推荐(0) 编辑
摘要:计算机表示浮点数(float或double类型)都有一个精度限制,对于超出了精度限制的浮点数,计算机会把它们的精度之外的小数部分截断。因此,本来不相等的两个浮点数在计算机中可能就变成相等的了 abs( fa - fb) < 0.000001 阅读全文
posted @ 2023-02-21 14:38 小秦同学在上学 阅读(26) 评论(0) 推荐(0) 编辑
摘要:静态类型:对象在声明时采用的类型,在编译期既已确定; 动态类型:通常是指一个指针或引用目前所指对象的类型,是在运行期决定的; 静态绑定:绑定的是静态类型,所对应的函数或属性依赖于对象的静态类型,发生在编译期; 动态绑定:绑定的是动态类型,所对应的函数或属性依赖于对象的动态类型,发生在运行期; 非虚函 阅读全文
posted @ 2023-02-21 14:35 小秦同学在上学 阅读(181) 评论(0) 推荐(0) 编辑
摘要:coredump是程序由于异常或者bug在运行时异常退出或者终止,在一定的条件下生成的一个叫做core的文件,这个core文件会记录程序在运行时的内存,寄存器状态,内存指针和函数堆栈信息等等,对这个文件进行分析可以定位到程序异常的时候对应的堆栈调用信息。 g++ coredumpTest.cpp - 阅读全文
posted @ 2023-02-21 14:02 小秦同学在上学 阅读(21) 评论(0) 推荐(0) 编辑
摘要:以例子进行讲解 #include <iostream> using namespace std; int f(int n) { cout << n << endl; return n; } void func(int param1, int param2) { int var1 = param1; 阅读全文
posted @ 2023-02-21 13:57 小秦同学在上学 阅读(108) 评论(0) 推荐(0) 编辑
摘要:多态: 同一事物表现出不同事物的能力,即向不同对象发送同一消息,不同的对象在接收时会产生不同的行为 重载实现编译时多态,虚函数实现运行时多态 基类的指针指向派生类的对象,指向的是派生类中基类的部分 C++的多态性可以解决基类指针不能操作派生类的数据成员的问题 实现多态的两种方法: 覆盖:是指子类重新 阅读全文
posted @ 2023-02-21 13:42 小秦同学在上学 阅读(20) 评论(0) 推荐(0) 编辑
摘要:对象复用: 设计模式:Flyweight享元模式 通过将对象存储到“对象池”中实现对象的重复利用,这样可以避免多次创建重复对象的开销,节约系统资源。 零拷贝 避免 CPU 将数据从一块存储拷贝到另外一块存储的技术 可以减少数据拷贝和共享总线操作的次数。 在C++中,vector的一个成员函数**em 阅读全文
posted @ 2023-02-21 13:35 小秦同学在上学 阅读(120) 评论(0) 推荐(0) 编辑
摘要:避免内存泄露的几种方式 记数法:使用new或者malloc时,让该数+1,delete或free时,该数-1,程序执行完打印这个计数,如果不为0则表示存在内存泄露 一定要将基类的析构函数声明为虚函数 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。 对象数组的释放一 阅读全文
posted @ 2023-02-21 11:41 小秦同学在上学 阅读(18) 评论(0) 推荐(0) 编辑
摘要:类成员初始化方式?构造函数的执行顺序 ?为什么用成员初始化列表会快一些? 赋值初始化,通过在函数体内进行赋值初始化;列表初始化,在冒号后使用初始化列表进行初始化。 对于在函数体中初始化,是在所有的数据成员被分配内存空间后才进行的。 列表初始化是给数据成员分配内存空间时就进行初始化 方法一是在构造函数 阅读全文
posted @ 2023-02-21 10:56 小秦同学在上学 阅读(65) 评论(0) 推荐(0) 编辑
摘要:const关键字的作用有哪些? 阻止一个变量被改变,可以使用const关键字 对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const 在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值; 对于类的成员函数,若指定其为const类型,则表明其 阅读全文
posted @ 2023-02-21 10:28 小秦同学在上学 阅读(19) 评论(0) 推荐(0) 编辑
摘要:C++中的类成员声明static 函数体内static变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; 在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外其它函数访问; 在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使 阅读全文
posted @ 2023-02-21 10:16 小秦同学在上学 阅读(158) 评论(0) 推荐(0) 编辑
摘要:1)try、throw和catch关键字 在程序中的用法如下 #include <iostream> using namespace std; int main() { double m = 1, n = 0; try { cout << "before dividing." << endl; if 阅读全文
posted @ 2023-02-21 10:10 小秦同学在上学 阅读(22) 评论(0) 推荐(0) 编辑
摘要:C++中有几种类型的new? 在C++中,new有三种典型的使用方法:plain new,nothrow new和placement new plain new 普通的new,就是我们常用的new\ void* operator new(std::size_t) throw(std::bad_all 阅读全文
posted @ 2023-02-21 09:53 小秦同学在上学 阅读(150) 评论(0) 推荐(0) 编辑
摘要:volatile 用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。 遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据, 阅读全文
posted @ 2023-02-20 16:03 小秦同学在上学 阅读(29) 评论(0) 推荐(0) 编辑
摘要:#include <iostream> using namespace std; int main() { int a = 0x1234; //由于int和char的长度不同,借助int型转换成char型,只会留下低地址的部分 char c = (char)(a); if (c == 0x12) c 阅读全文
posted @ 2023-02-20 15:57 小秦同学在上学 阅读(26) 评论(0) 推荐(0) 编辑
摘要:内联函数 如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。 一个函数定义为内联函数,则需要在函数名前面放置关键字 inline 在类定义中的定义的函数都是内联函数,即使没有使用 inline 说明符 内联函数以代码复杂为代价,它以省去函数调用的开销来提高执行 阅读全文
posted @ 2023-02-20 15:34 小秦同学在上学 阅读(49) 评论(0) 推荐(0) 编辑
摘要:#include <iostream> using namespace std; class Student{ public: Student(){//默认构造函数,没有参数 this->age = 20; this->num = 1000; }; Student(int a, int n):age 阅读全文
posted @ 2023-02-20 15:30 小秦同学在上学 阅读(40) 评论(0) 推荐(0) 编辑
摘要:重载 是指在同一范围定义中的同名成员函数才存在重载关系。主要特点是函数名相同,参数类型和数目有所不同 不能出现参数个数和类型均相同,仅仅依靠返回值不同来区分的函数 //父类 class A{ public: virtual int fun(int a){} } //子类 class B : publ 阅读全文
posted @ 2023-02-20 15:28 小秦同学在上学 阅读(36) 评论(0) 推荐(0) 编辑
摘要:C的类型安全 C只在局部上下文中表现出类型安全,比如试图从一种结构体的指针转换成另一种结构体的指针时,编译器将会报告错误,除非使用显式类型转换。 printf格式输出 上述代码中,使用%d控制整型数字的输出,没有问题,但是改成%f时,明显输出错误,再改成%s时,运行直接报segmentation f 阅读全文
posted @ 2023-02-20 15:23 小秦同学在上学 阅读(28) 评论(0) 推荐(0) 编辑
摘要:都是是指向无效内存区域(这里的无效指的是"不安全不可控")的指针 int main(void) { int* p; // 未初始化 std::cout<< *p << std::endl; // 未初始化就被使用 return 0; } 野指针: 指的是没有被初始化过的指针 为了防止出错,对于指针初 阅读全文
posted @ 2023-02-20 15:06 小秦同学在上学 阅读(14) 评论(0) 推荐(0) 编辑
摘要:为了能够正确的在C++代码中调用C语言的代码:在程序中加上extern "C"后,相当于告诉编译器这部分代码是C语言写的,因此要按照C语言进行编译,而不是C++; 哪些情况下使用extern "C": C++代码中调用C语言代码; 在C++中的头文件中使用; 在多个人协同开发时,可能有人擅长C语言, 阅读全文
posted @ 2023-02-20 15:03 小秦同学在上学 阅读(153) 评论(0) 推荐(0) 编辑
摘要:拷贝初始化和直接初始化 直接初始化直接调用与实参匹配的构造函数,拷贝初始化总是调用拷贝构造函数。 拷贝初始化首先使用指定构造函数创建一个临时对象,然后用拷贝构造函数将那个临时对象拷贝到正在创建的对象。 可以发现用=就是拷贝构造函数 string str1("I am a string");//语句1 阅读全文
posted @ 2023-02-20 14:59 小秦同学在上学 阅读(75) 评论(0) 推荐(0) 编辑
摘要:override: 当在父类中使用了虚函数时候,你可能需要在某个子类中对这个虚函数进行重写,以下方法都可以: class A { virtual void foo(); } class B : public A { void foo(); //OK virtual void foo(); // OK 阅读全文
posted @ 2023-02-20 14:51 小秦同学在上学 阅读(31) 评论(0) 推荐(0) 编辑
摘要:C++中const和static的作用 static: 不考虑类的情况 隐藏。不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用 默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区 静态变量在函数内定义,始终存在 阅读全文
posted @ 2023-02-20 14:45 小秦同学在上学 阅读(42) 评论(0) 推荐(0) 编辑
摘要:编译阶段 define是在编译的预处理阶段起作用,类似于代码插入 const是在编译、运行的时候起作用 安全性: define只做替换,不做类型检查和计算,也不求解,容易产生错误 const常量有数据类型,编译器可以对其进行类型安全检查 内存占用 define只是将宏名称进行替换,在内存中会产生多分 阅读全文
posted @ 2023-02-20 14:25 小秦同学在上学 阅读(25) 评论(0) 推荐(0) 编辑
摘要:C++中struct和class的区别 相同点: 两者都拥有成员函数、公有和私有部分 任何可以使用class完成的工作,同样可以使用struct完成 不同点: struct默认是公有的,class则默认是私有的 class默认是private继承, 而struct默认是public继承 C++和C的 阅读全文
posted @ 2023-02-20 14:22 小秦同学在上学 阅读(25) 评论(0) 推荐(0) 编辑
摘要:C++和Python的区别 python是一种脚本语言,是解释执行的,而C++是编译语言,是需要编译后在特定平台运行的。 python可以很方便的跨平台,但是效率没有C++高。 Python使用缩进来区分不同的代码块,C++使用花括号来区分 C++中需要事先定义变量的类型,而Python不需要 Py 阅读全文
posted @ 2023-02-20 14:13 小秦同学在上学 阅读(100) 评论(0) 推荐(0) 编辑
摘要:指针常量:本质是指针,但是指向常量,也就是可以改变指向,但是不可以改变指向的值 -常量指针:本质是指针,但是是常量的指针,不可以改变指向,但是可以改变指向的值 a和&a有什么区别? int a[10]; int (*p)[10] = &a a是数组名,是数组首元素地址,+1表示地址值加上一个int类 阅读全文
posted @ 2023-02-20 14:09 小秦同学在上学 阅读(27) 评论(0) 推荐(0) 编辑
摘要:''' int main(int argc, char const *argv[]){ const char* str = "name"; sizeof(str); // 取的是指针str的长度,是8 strlen(str); // 取的是这个字符串的长度,不包含结尾的 \0。大小是4 return 阅读全文
posted @ 2023-02-20 13:59 小秦同学在上学 阅读(19) 评论(0) 推荐(0) 编辑
摘要:变量声明和定义区别? 声明仅仅是把变量的声明的位置及类型提供给编译器,并不分配内存空间;定义要在定义的地方为其分配存储空间。 相同变量可以在多处声明(外部变量extern),但只能在一处定义 搞懂全局变量、外部变量、静态全局变量的区别 全局变量 是在函数的外部定义的,它的作用域为从变量定义处开始,到 阅读全文
posted @ 2023-02-20 11:58 小秦同学在上学 阅读(75) 评论(0) 推荐(0) 编辑
摘要:#define 标识符 替换列表 宏定义和函数有何区别? 宏在预处理阶段完成替换,之后被替换的文本参与编译,相当于直接插入了代码,运行时不存在函数调用,执行起来更快; 宏定义属于在结构中插入代码,没有返回值;函数调用具有返回值。 宏定义参数没有类型,不进行类型检查;函数参数具有类型,需要检查类型。 阅读全文
posted @ 2023-02-20 11:51 小秦同学在上学 阅读(68) 评论(0) 推荐(0) 编辑
摘要:int *p = new float[2]; //编译错误(类型安全) int p = (int)malloc(2 * sizeof(double));//编译无错误 相同点: 都可用于内存的动态申请和释放 不同点: 前者是C++运算符(一般用于生成对象),后者是C/C++语言标准库函数 new自动 阅读全文
posted @ 2023-02-20 11:40 小秦同学在上学 阅读(150) 评论(0) 推荐(0) 编辑
摘要:int *p[10] int (*p)[10] int *p(int) int (*p)(int) int *p[10]表示指针数组,强调数组概念,是一个数组变量,数组大小为10,数组内每个元素都是指向int类型的指针变量。 int (*p)[10]表示数组指针,强调是指针,只有一个变量,是指针类型 阅读全文
posted @ 2023-02-20 11:37 小秦同学在上学 阅读(91) 评论(0) 推荐(0) 编辑
摘要:申请方式不同 栈由系统自动分配 堆是自己申请和释放的 申请大小限制不同 栈空间默认是4M, 堆区一般是 1G - 4G 申请效率不同 栈由系统分配,速度快,不会有碎片。 堆由程序员分配,速度慢,且会有碎片。 阅读全文
posted @ 2023-02-20 11:34 小秦同学在上学 阅读(18) 评论(0) 推荐(0) 编辑
摘要:指针是一个变量,存储的是一个地址,引用跟原来的变量实质上是同一个东西,是原变量的别名 指针可以有多级,引用只有一级 指针可以为空,引用不能为NULL且在定义时必须初始化 指针在初始化后可以改变指向,而引用在初始化之后不可再改变 sizeof指针得到的是本指针的大小,sizeof引用得到的是引用所指向 阅读全文
posted @ 2023-02-20 11:29 小秦同学在上学 阅读(39) 评论(0) 推荐(0) 编辑
摘要:main执行之前和之后执行的代码可能是什么? 执行之前: 主要用于初始化系统相关资源 设置栈指针 初始化静态变量和全局变量。.data段的内容 没有初始化的全局变量赋初始值 全局对象初始化 将main函数的参数传递给main函数,然后才真正运行main函数 attribute((constructo 阅读全文
posted @ 2023-02-20 11:20 小秦同学在上学 阅读(26) 评论(0) 推荐(0) 编辑
摘要:有名管道 因为匿名管道只能用于有亲缘关系间的进程通信,所以为了没有亲缘关系之间的进程通信,提出了有名管道 有名管道(FIFO)提供了一个路径名与之关联,并以FIFO的文件形式存放在文件系统中,打开方式和普通文件一样。这样进程之间只需要访问该路径,就可以彼此通过FIFO通信。 一旦打开FIFO,就可以 阅读全文
posted @ 2023-02-09 14:57 小秦同学在上学 阅读(44) 评论(0) 推荐(0) 编辑
摘要:管道的读写特点 使用管道时需要注意以下几种特殊的情况(假设都是阻塞IO操作) 所有的指向管道写端的文件描述符都关闭了(即管道写端的文件描述符的引用计数为0)。有进程从管道的读端读数据,那么管道中剩余的数据被读取以后,再次read会返回0,就像读到文件末尾一样。 如果有指向管道写端的文件描述符没有关闭 阅读全文
posted @ 2023-02-09 11:50 小秦同学在上学 阅读(84) 评论(0) 推荐(0) 编辑
摘要:/* - 实现 ps aux | grep *** - 子进程:执行ps aux 子进程结束后,将数据发送给父进程 - 父进程:获取到数据,并进行过滤 - pipe() - execlp():默认把结果输出的标准终端,需要把子进程的stdout_fileno标准输出重定向到管道的写端 dup2 */ 阅读全文
posted @ 2023-02-09 11:11 小秦同学在上学 阅读(22) 评论(0) 推荐(0) 编辑
摘要:/* #include <unistd.h> int pipe(int pipefd[2]); 功能:创建匿名管道,用于进程间通信 参数: - int pipefd[2] 这个数组是一个传出参数 - pipefd[0]对应管道的读端 - pipefd[1]对应管道的写端 返回值: 成功:返回0 失败 阅读全文
posted @ 2023-02-09 10:38 小秦同学在上学 阅读(39) 评论(0) 推荐(0) 编辑
摘要:匿名管道 管道也叫无名(匿名)管道,它是UNIX系统IPC(进程间通信)的最古老形式,所有的UNIX系统都支持这种通信机制。 统计一个目录中文件的数目命令:ls | wc -l。为了执行该命令,shell创建了两个进程来分别执行ls和wc。 上述 | 称之为管道符,会将ls得到的结果通过管道传输给w 阅读全文
posted @ 2023-02-08 22:52 小秦同学在上学 阅读(48) 评论(0) 推荐(0) 编辑
摘要:进程间通信(IPC) 你知道进程间通信方式有哪几种吗? 某种方式具体原理? 进程是一个独立的资源分配单元,不同进程之间是独立的,没有关联,不能在一个进程直接访问另一个进程的资源 但是进程不是孤立的,不同的进程需要进行信息的交互与状态的传递,因此需要进程间通信 ####进程间通信目的 数据传输:一个进 阅读全文
posted @ 2023-02-08 22:14 小秦同学在上学 阅读(23) 评论(0) 推荐(0) 编辑
摘要:进程退出 #include<stdlib.h> void exit(int status); #include<unistd.h> void _exit(int status); status:是进程退出时的一个状态信息。父进程回收子进程资源的时候可以获取到 exit()在进程推出前刷新IO缓冲区 阅读全文
posted @ 2023-02-08 22:04 小秦同学在上学 阅读(43) 评论(0) 推荐(0) 编辑
摘要:exec函数族 一般先创建一个子进程,再在子进程中调用exec函数族 会根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,即在调用进程内部执行一个可执行文件 exec函数族执行成功后不会返回,因为调用进程的实体,包括代码段、数据段和堆栈都已经被新的内容取代,只留下进程ID等表面上的信息,只 阅读全文
posted @ 2023-02-08 21:07 小秦同学在上学 阅读(19) 评论(0) 推荐(0) 编辑
摘要:父子进程之间的关系 ####不同点 fork函数的返回值不同 父进程中:>0 返回的是子进程ID 子进程中:=0 PCB中的一些数据 当前进程的id pid 当前进程的父进程的id ppid 信号集 共同点 某些状态下:子进程刚被创建出来,还没有执行写操作 用户区的数据 文件描述符表 父子进程对变量 阅读全文
posted @ 2023-02-08 20:37 小秦同学在上学 阅读(42) 评论(0) 推荐(0) 编辑
摘要:fork进程创建 创建子进程,会复制当前的父进程 子进程和父进程运行在分开的内存空间,但是在fork()时两者有相同的内容 fork:用于创建子进程 #include <sys/types.h> #include <unistd.h> pid_t fork(void); 作用:用于创建子进程 返回值 阅读全文
posted @ 2023-02-08 20:15 小秦同学在上学 阅读(19) 评论(0) 推荐(0) 编辑
摘要:程序和进程 程序:(文件) 进程:(资源) 并行与并发 并行:同一时刻,有多条指令在多个处理器上同时执行 并发:在同一时刻只能有一条指令执行,但多个进程指令被快速轮换,使得宏观上具有多个进程同时执行的效果 进程控制块 为了管理进程,内核为每个进程分配一个进程控制块,进程控制块为task_struct 阅读全文
posted @ 2023-02-08 17:39 小秦同学在上学 阅读(20) 评论(0) 推荐(0) 编辑
摘要:标准C库: #include <stdio.h> int fseek(FILE *stream, long offset, int whence); Linux库: #include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_ 阅读全文
posted @ 2023-02-08 16:59 小秦同学在上学 阅读(99) 评论(0) 推荐(0) 编辑
摘要:/* #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 参数: -fd:文件描述符,open()得到,通过这文件描述符操作某个文件 -buf:需要读取数据存放的地方,数组的地址 -count:指定的数组的大小 返回值 阅读全文
posted @ 2023-02-08 16:43 小秦同学在上学 阅读(9) 评论(0) 推荐(0) 编辑
摘要:文件描述符 程序只占用磁盘空间,不占用内存空间 程序启动后产生进程,进程在内存中 通过fopen()会返回一个文件描述符,用于定位操作文件 文件描述符位于虚拟存储空间的内核区 PCB:进程控制块,用于需要管理的数据 PCB内部有一个数组(文件描述符表,以为一个进程可以同时打开多个文件 在文件描述符表 阅读全文
posted @ 2023-02-08 15:56 小秦同学在上学 阅读(47) 评论(0) 推荐(0) 编辑
摘要:虚拟地址空间 实际上不存在 虚拟内存,用于解决内存不足或段错误 32位机器:2^32 64位机器:2^48 MMU:内存管理单元会讲虚拟地址空间映射到真实地址空间中 用户区:NULL在受保护的地址 栈空间:高地址向低地址存 堆空间:低地址向高地址存 内核区:用户只可以通过系统调用修改内核数据 阅读全文
posted @ 2023-02-08 15:38 小秦同学在上学 阅读(14) 评论(0) 推荐(0) 编辑
摘要:IO I input O output 内存角度 输入:文件读取数据到内存 输出:内存数据写到文件 标准C库IO函数 标准C库IO函数(不属于操作系统,在不同的平台上通过相同的函数调用不同的系统api) 跨平台(可以在windows和linux运行) 效率高 文件描述符:指向已经打开的文件 文件读写 阅读全文
posted @ 2023-02-08 15:21 小秦同学在上学 阅读(18) 评论(0) 推荐(0) 编辑
摘要:GDB GDB是由GNU软件社区提供的调试工具,同GCC配套组成一套完整的开发环境 启动程序,按照自定义要求随性所欲运行程序 在所指定的断点处停止 程序停止时,可以检查程序中所发生的事 可以改变程序,将一个bug产生的影响修正去测试其他的bug 1、编译生成带有调试信息的参数 -g 2、GDB命令的 阅读全文
posted @ 2023-02-08 15:02 小秦同学在上学 阅读(31) 评论(0) 推荐(0) 编辑
摘要:什么是Makefile 工程中的文件不计其数,其按类型、功能和模块放在若干个目录中 Makefile文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件后编译,哪些文件需要重新编译 Makefile带来的好处就是“自动化编译”,一旦写好,可以用make命令整个工具完成自动编译 make是一个命令 阅读全文
posted @ 2023-02-07 21:39 小秦同学在上学 阅读(85) 评论(0) 推荐(0) 编辑
摘要:程序编译成可执行程序的过程 动态库会在链接过程中将自己名字信息打包到可执行文件中,但是不会把自己代码打包过去 静态库则是会将自己的代码直接打包到可执行文件中 静态库的创建 动态库的创建 动态库的api是在运行中查找,一般需要手动改变环境变量 静态库优缺点 静态库的加载速度快 发布程序无需提供静态库, 阅读全文
posted @ 2023-02-07 20:53 小秦同学在上学 阅读(79) 评论(0) 推荐(0) 编辑
摘要:动态库的制作 动态库也称为共享库 注意一定加上 -fpic 动态库加载失败原因: 程序启动之后,程序会把动态库的的内容加载到内存之中,通过ldd命令检查动态库依赖关系 解决动态库加载失败 env 可以查看环境变量 export LD-LTBRARY_PATH=$LD-LTBRARY_PATH:绝对路 阅读全文
posted @ 2023-02-07 20:40 小秦同学在上学 阅读(41) 评论(0) 推荐(0) 编辑
摘要:库文件 计算机上的一类文件,可以看作代码库 两种,静态库和动态库 静态库在程序的链接阶段被复制到程序中;动态库在链接阶段没有被复制,而是在运行时由系统动态的加载到内存供程序使用 代码保密,方便部署和分发 命名规则 使用gcc -c add.c(文件名,可以有多个文件)来生成 .o文件 -I ./in 阅读全文
posted @ 2023-02-07 20:02 小秦同学在上学 阅读(26) 评论(0) 推荐(0) 编辑
摘要:GCC GNU编译器 '-std=c99' 表示指定编译标准 安装 sudo apt install gcc g++ 查看版本 gcc/g++ -v/--version 运行 gcc test.c -o app (编译) ./app 其中,app为自命名,可以随便命名 编译语言发展 GCC工作流程 阅读全文
posted @ 2023-02-07 19:36 小秦同学在上学 阅读(31) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示