自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 生产者消费者问题

生产者/消费者问题,也被称作问题。可以描述为∶两个或者更多的线程共享同一个缓冲区,其中一个或多个线程作为"生产者"会不断地向缓冲区中添加数据,另一个或者多个线程作为"消费者"从缓冲区中取走数据。生产者/消费者模型关注的是以下几点:1.生产者和消费者必须2.缓冲区空时,消费者不能读取数据;缓冲区满时,生产者不能添加数据因为多了一个缓冲区,所以生产者和消费者并不直接相互调用,这样生产者和消费者的代码发生变化,都不会对对方产生影响。...

2022-08-02 18:53:02 37 1

原创 MVC模型:日历系统

MVC模型日历系统。

2022-07-26 20:22:58 145

原创 进程间通信( IPC):消息队列

进程间通信 IPC :管道、信号量、共享内存、消息队列、套接字进程间通信,两个进程间传递信息除了套接字,前面几个主要是在同一台主机上两个进程间通信通过ipcs查看消息队列 消息队列与命名管道有许多相似之处,但少了在打开和关闭管道方面的复杂性。但使用消息队列并未解决我们在使用命名管道时遇到的一些问题,比如管道满时的阻塞问题。 消息队列提供了一种在两个不相关的进程之间传递数据的相当简单且有效的方法。与命名管道相比,消息队列的优势在于,它独立于发送和接收进程而存在,这消除了在同步命名

2022-07-09 16:43:49 165

原创 进程间通信(IPC):共享内存

进程间通信(IPC):共享内存。共享内存是先在物理内存上申请一块空间,多个进程可以将其映射到自己的虚拟地址空间中。所有进程都可以访问共享内存中的地址,就好像它们是由 malloc 分配的一样。如果某个进程向共享内存写入了 数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。由于它并未提供同步机制,所以我们通常需要用其他的机制.........

2022-07-05 15:33:29 121

原创 进程间通信(IPC):信号量

进程间通信 IPC :管道、信号量、共享内存、消息队列、套接字进程间通信,两个进程间传递信息除了套接字,前面几个主要是在同一台主机上两个进程间通信像现实生活中的红绿灯,用来控制资源的使用信号量:特殊的变量(一般为正数),代表可用资源的数目减一 : 代表获取资源(p操作)加一 : 代表释放资源(v操作)(例如商场试衣间是可用资源,若有人使用,可用资源减一,有人出来,可用资源加一)信号量变为0的时候,代表没有资源可用,再使用资源会阻塞pv操作是一个原子操作,就是不可分割的操作信号量的值如果只取0,1 ,将其称为

2022-06-19 15:51:36 97

原创 进程间通信(IPC):管道

进程间通信 IPC :管道、信号量、共享内存、消息队列、套接字进程间通信,两个进程间传递信息除了套接字,前面几个主要是在同一台主机上两个进程间通信管道分为有名管道和无名管道使用 | , bash 可以自动创建一个有名管道还是可以使用open(打开管道,分配的空间在内存中)read(读取数据) write(写入数据)close(关闭管道)eg:文件a和文件b,文件a负责向管道中写数据,文件b负责读数据a.c文件b.c文件a,b文件单独执行时会被阻塞住 管道必须在两个进程间执行,单个进程是没法执行的

2022-06-17 21:03:12 67

原创 gdb调试

gdb 调试程序编译程序的时候需要后面加上-g,将调试信息添加在可执行文件中eg:编译mybash文件不加调试信息前加上调试信息后,可执行文件变大 eg:一般只显示10行,一般从主函数位置开始显示显示行数附近的代码显示此函数附近的代码 此时上一次命令是 l 显示代码......

2022-06-17 10:20:47 22

原创 this指针

c++对象模型:各对象的代码区公用区分对象时根据属性值区分的,对象的方法都是一样的。上图对象只存储自己的属性,方法共享,这种模型可以大大节省空间。但是有一个问题,方法(也就是函数)如何区分处理的是哪一个对象——this指针!通过this指针判断是哪一个对象this指针编译器针对程序员自己设计的类型分三次编译。第一:识别和记录类体中属性的名称,类型和访问限定,与属性在类体中的位置无关。如class CGoods中的Name,Amount,Price,Total_

2022-05-24 09:33:39 50

原创 信号

信号:通知进程产生了某种事件信号是系统响应某个条件而产生的事件,进程接收到信号会执行相应的操作。与信号有关的文件调用在“signal.h”头文件中有声明。信号其实就是一个软件中断。可以通过signal()修改对信号的响应方式。信号一般有三种响应方式:1)默认响应;2)忽略响应;3)自定义响应。通过 kill 发送响应。int kill(pid_t pid, int sig);命令kill 就是对系统调用kill 的封装,命令kill就是通过系统调用kill给程序发送一个信号.

2022-05-21 21:50:10 81

原创 String

c++中定义一个字符串变量可以直接使用string string str = "zyt";string 有许多方法:元素访问: at 访问指定字符,有边界检查 (公开成员函数) operator[] 访问指定字符 (公开成员函数) front (C++11) 访问首字符 (公开成员函数) back (C++11) 访问最后的字符 (公开成员函数)

2022-05-19 20:17:38 116

原创 typedef 和 using

typedef是在计算机编程语言中用来为复杂的声明定义简单的别名。typedef 可以将一切合法的变量名(指针名,数组名)转化为类型名。typedef 具体讲解见文章:typedef_♚陌上花开的博客-CSDN博客http://t.csdn.cn/zkjfuhttp://t.csdn.cn/zkjfuusing 和typedef 的用法相同,都是用来给复杂的声明定义简单的别名的。typedef unsigned int u_int;//u_int 就是unsigned int类型usin

2022-05-19 15:10:26 124

原创 指针空值——nullptr

以c语言和c++分别运行以下代码,大家可以先猜猜此程序在不同环境中的运行结果是什么,会不会有什么不同~#include<stdio.h>void func(char* p){ printf("char*\n");}void func(int x){ printf("char*\n");}int main(){ func(NULL); return 0;}#include<iostream>using namespace std;void f

2022-05-19 14:35:29 2085

原创 基于范围的for循环

在c98中,不同的容器和数组,遍历的方法不尽相同,写法不统一。c++11基于范围的for循环以统一,简洁的方式来遍历容器和数组,用起来更方便了。c++标准库里的容器:#include<array> 数组容器#include<vector> 向量容器,顺序表容器#include<list> 双链表容器#include<map> 映射容器(底层是红黑树)#include<set...

2022-05-19 11:36:30 81

原创 C11的新特性-auto关键字,decltype关键字

C++11引入了auto(类型识别)和decltype(类型推演)关键字实现类型推导,通过这两个关键字不仅能方便地获取复杂的类型,而且还能简化书写,提高编码效率。一、auto关键字C11中auto成为类型指示符(type-specifier)。auto类型推导: auto定义的变量,可以根据初始化的值,在编译时推导出变量名的类型。int main(){ auto a = 10;//a int auto ip = new auto(1);//1 是整型,将整型的地址给ip, ip in

2022-05-19 10:13:35 116

原创 进程替换和malloc

一、进程替换方式:1>使用exec系列库函数#include <unistd.h>extern char **environ;int execl(const char *pathname, const char *arg, .../* (char *) NULL */);int execlp(const char *file, const char *arg, .../* (char *) NULL */);int execle(const char *pathn

2022-05-19 09:27:01 62

原创 Linux vim中如何不带行号复制大段代码

目录1>只可以在vim复制2>可以复制到外界的1>只可以在vim复制末行模式下 使用命令 v 进入可视模式此时使用 “上下左右键”,选中想要复制的部分,在vim中可以看到选中的文本变颜色,就像在windows系统下的shift键加上鼠标左键的效果一样命令 y 复制,p粘贴2>可以复制到外界的按照常规复制,结果如下 1 #include<stdio.h> 2 #include<stdlib.h..

2022-05-18 13:25:37 352

原创 文件描述符,Linux操作系统文件的系统调用 open read write close

fork——父进程打开的文件fork复制到子进程中,子进程也可以访问。c 语言使用 fopen(),打开一个文件,文件类型为 FILE*fclose()关闭文件。Linux通过操作系统的子模块——文件系统来管理文件通过文件id号来管理文件,每个文件的ID号是唯一的一、 openc语言中使用fopen打开文件,fopen是库函数。Linux 通过open打开文件,是一种系统调用,在内核中实现。fopen->open(),fopen底层调用open包含头文件#inc

2022-05-17 17:53:58 461

原创 僵死进程,孤儿进程

一、僵死进程 1 #include<stdlib.h> 2 #include<unistd.h> 3 #include<stdio.h> 4 int main() 5 { 6 int n=0; 7 char *s = NULL; 8 9 pid_t id = fork(); 10 if(id == -1) 11 { 12 exit(1); 13 }

2022-05-11 14:20:41 128

原创 Linux:printf

linux中常用头文件:#include<stdlib.h>此头文件包含函数exit(0); 用来退出当前进程,windows上习惯用return 0;使用return 0;系统会帮忙调用exit(0);#include<unistd.h>包含了Linux常用的函数调用以及系统声明头文件存放于/usr/include中printf中\n的用处有以下main.c文件此时printf函数输出内容具有换行符,sleep3s后结束程序...

2022-05-09 16:49:23 316

原创 库文件的生成和使用

一、库文件库是一组预先编译好的函数方法的集合Linux上库文件的存放位置: /lib和/usr/lib库分为两种:静态库和共享库Linux上静态库标识(libxxx.a),共享库(libxxx.so)Windows上静态库标识(.lib),共享库(.dll)二、静态库的生成和使用1)静态库的生成这里有生成静态库的文件,其中add.c,max.c存放函数的实现,其中fun.h存放函数的声明如何生成静态库?第一步:将静态库需要的".c"文件进行编译,生成"".o"文件

2022-05-06 15:00:48 326

原创 makefile和make

一、make的安装输入命令:sudo apt install make需要密码,根据提示输入密码即可。二、makefile和make命令的介绍makefile文件:Linux上的项目工程管理工具,可以实现自动化编译。主要用于项目工程里源文件过多,makefile文件可以根据类型,功能,模块,将这些源文件分好到不同目录里,makefile文件里面就可以定义一系列的规则来指定哪一些文件先需要进行编译,文件需要重新编译,甚至更复杂的操作,makefile文件就像一个shell脚本一样,可以一系

2022-05-05 18:47:34 714 4

原创 编译与调试

gcc主要处理c语言中的.c文件c语言 .c文件如果想要直接去运行,首先需要将源文件变成可执行文件这个过程可以细分为四个过程:预编译,编译、汇编、链接gcc分步编译:(1)预编译gcc -E main.c -o main.i(-o :out输出,输出想要得到的文件(自己命名),不加-o,生成一个默认的文件)(2)编译gcc -S main.i -o main.s(3)汇编gcc -c main.s -o ...

2022-04-28 17:26:36 148

原创 函数重载

依据:名字粉碎技术在C语言函数的定义中,函数名必须为它们加以区别的,完成同一个任务的函数常常需要根据调用参数个数的不同或类型的不同而定义多个不同的函数名。在C++中,提供了函数的重载机制,对功能相同但参数个数不同或类型不同的函数可以使用相同的函数名,由此,在调用时无需定义多个函数名,而由编译器根据参数类型选择被调函数。C语言区分函数的不同通过函数名区分,c++通过函数原型(函数返回值+函数名称+参数列表(参数的类型和个数))区分。int max(int a, int b){ return

2022-04-26 21:16:15 107

原创 缺省参数

一般情况下,函数调用时的实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有缺省参数的函数,这种函数调用时,实参个数可以与形参不相同。缺省参数指在定义函数时为形参指定缺省值(默认值)。这样的函数在调用时,对于缺省参数,可以给出实参值,也可以不给出参数值。如果给出实参,将实参传递给形参进行调用,如果不给出实参,则按缺省值进行调用。缺省参数的函数调用:缺省实参并不一定是常量表达式,可以是任意表达式,甚至可以通过函数调用给出。如果缺省实参是...

2022-04-26 18:42:16 309

原创 如何判断是以c++方式编译还是c方式编译

如何判断是以c++方式编译还是c方式编译

2022-04-21 17:27:19 911

原创 C++统一初始化和输入输出

一、c++统一初始化C语言中初始化一个量只有赋值语句这一种办法c++中初始化方式比较多#include<iostream>using namespace std;int main(){ int a = 10;//c语言中初始化只有赋值语句这一种方法 //以下都是c++初始化的方法 int b(10);//这样有点像对象初始化的形式 int c{ 10 };//int c = {20}; int d = int(10); int e = int{ 10 }; r

2022-04-21 16:59:32 628

原创 左值右值,柔性数组

文章目录一、右值、左值二、1.2.一、右值、左值在c中,左值就是可以被赋值的,右值就是不可被赋值的在c11标准下:所有的值必属于左值、右值两者之一。右值分为纯右值和将亡值在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。左值有地址,名字与生存期一致,有名字就有生存期。右值不能取地址。&&引用普通对象,纯右值(只能引用右值,也就是没有名字的)右值变左值,给一个名字。二、1.2....

2022-04-17 23:22:29 269

原创 gcc ,g++,gdb的安装

1.gcc的安装sudo apt install gcc2.g++的安装sudo apt install g++3.gdb的安装sudo apt install gdb

2022-04-14 20:19:46 139

原创 文件查看命令和用户管理命令

cat1.用于查看文件数据cat a.txt2.合并文件cat a.txt b.txt > c.txt3.向文件中写入数据cat > d.txt ,这样写入数据有一点需要注意:cat > d.txt 输入数据时,会先将d.txt中的数据清空。...

2022-04-13 22:30:00 52

原创 类的继承与派生

类及对象的访问权限:类中的成员函数可以直接访问类中的数据成员(包括私有成员、公有成员、保护成员);类中的成员函数可以相互访问;类的对象只能访问类的公有成员,不能访问私有成员及保护成员。一、继承与派生在C++中,类具有继承性,所谓继承就是在一个已存在的类的基础上建立一个新的类。利用类的继承,可以将原来的程序代码重复使用,从而减少了程序代码的冗余度,符合软件重用的目标。增强编程语言的功能。提高软件开发效率。在继承关系中,被继承的类称为基类(或父类),把通过继承关......

2022-04-01 16:23:06 2047

原创 for()循环参数调用顺序

for(表达式1;表达式2;表达式3){ 循环体语句;}表达式1:初始化语句表达式2:判断条件语句表达式3:控制条件语句A.先调用表达式1,初始化变量;B.再调用表达式2,判断变量是否满足条件,True则继续执行,flase则结束循环;C.执行循环语句;D.调用表达式3,B,C,D,B··········(循环)打印邮费价格表,输出20kg以内物品的邮费价格表,邮费计算规则如下所示:1kg以内6元。超过1kg,每增加1kg加收2元。...

2022-03-23 12:54:10 58

原创 拷贝构造函数

同一个类的对象在内存中有完全的结构,如果作为一个整体进行复制或者拷贝是完全可行的。这个拷贝过程只需要拷贝数据成员,而函数成员是共用的(只有一份拷贝)。在建立对象时可用同一类的另一个对象来初始化该对象的存储空间,这时所用的构造函数称为拷贝构造函数。拿一个对象初始化另一个对象时,会调用拷贝构造函数。若没有拷贝构造函数,系统会给出一个默认的拷贝构造函数。...

2022-03-16 18:35:59 314

原创 友元函数,友元类,类模板

C++提供友元机制,允许外部类和函数访问类的私有成员和保护成员的辅助方法,即将它们声明为一个给定类的友元类(或友元函数),使其具有类成员函数的访问权限。但友元本身不是类的成员,它不属于任何类。优点:提高软件的可靠性、可重用性、可维护性。不足:增加了程序运行时函数的调用开销——当成员函数调用很频繁时,将导致执行效率的降低,增加程序的运行时间。友元可以是普通的函数,或已定义的其他类的成员函数,或整个类。将一个函数设为友元,称为友元函数,将一个类设为友元,称为友元类。友元类的所有成员函数都可以访问授予友

2022-03-13 15:38:23 668

原创 静态成员

为了实现一个类的多个对象之间的数据共享,C++提出了静态成员的概念。静态成员包括:静态数据成员和静态成员函数静态成员的作用:1.静态成员不属于某一个对象,而属于一个类(属于所有对象),无论建立多少个对象,都共享静态成员——是连接各个对象的桥梁。2.静态数据成员主要用于各个对象共用数据。如:总数的统计、平均数等。静态数据成员的定义:static 数据类型 数据成员名;class student{private: int num; char* name; static

2022-03-13 15:18:30 992

原创 对象的动态建立和释放,赋值和复制

利用new运算符可以动态地分配对象空间,delete运算符释放对象空间。动态分配对象的一般形式:new 类名;用new运算符动态分配得到的对象是无名的,它返回一个指向新对象的指针的值,即所分配的内存单元的起始地址。程序通过这个地址可以间接访问这个对象,因此需要定义一个指向类的对象的指针变量来存放该地址。类名 * 对象指针变量;对象指针变量= new类名;如: student *p; p = new student;...

2022-03-13 11:35:13 1063

原创 共用数据的保护

C++有不少措施保护数据的安全性,如private保护类的数据成员等。但对于一些共用的数据,如函数实参与形参等,我们可以在不同的场合通过不同的途径访问同一个数据对象。有时不经意的误操作会改变数据的值。一、常对象既要使数据能在函数间共享,又要保证它不被任意修改,可以使用const限定,即把数据定义为只读的。在定义对象时使用const限定,称它为常对象。定义的一般形式为: 类名 const 对象名(实参列表);或 const 类名 对象名(实参列表);如: const studen..

2022-03-11 19:10:21 1097

原创 对象数组与对象指针

一、对象数组将具有相同类类型的对象有序地集合在一起便构成了对象数组。一维对象数组定义形式:类名 对象数组名[常量表达式];如: student stu1[10];对象数组使用说明:1)在建立对象数组时,需要调用构造函数。如果对象数组有10个元素,就需要调用10次构造函数。2)如果构造函数只有一个参数,在定义数组时可以直接在初值列表中提供实参如:student stu1[3] = {67,75,89 };3)如果构造函数有多个参数,则不能在定义数组时直接提供所有实参,应分别写

2022-03-10 20:55:32 487

原创 类和对象的初始化(构造函数与析构函数)

类的数据成员不能在类定义时初始化。class student{ int num = 20060102; char name[15] = "张三"; float score = 85;};//错误如果一个类中所有的数据成员都是公用的public,则可以在定义对象时对数据成员进行初始化。class studet{ public: int num; char name[15]; float score;}stu1 = { 200101

2022-03-10 19:29:12 968

原创 产生随机数

产生随机数需要用到rand()函数,此函数需要头文件stdlib.h若只使用rand()函数,产生的随机数为伪随机数,因为rand()函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。若想每次产生的随机数都不同,需要改变随机种子,可以使用时间来改变系统随机种子。int rand_()//产生随机数{ time_t ts; unsigned int n = time(

2022-01-04 00:11:19 110 1

原创 猜数字游戏

#include<stdio.h>#include<stdlib.h>#include<time.h>int rander()//产生随机数{ time_t ts; unsigned int n = time(&ts);//获取时间 srand(n);//初始化随机种子 int num = rand() % 100 + 1;//随机数范围1—100 return num;} int main(){ int a = -1; char o.

2022-01-04 00:00:37 2200 1

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