自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 信号量实现进程同步

IPC机制一个让人烦恼的问题是:编写错误的程序或因为某些原因而执行失败的程序将把它的IPC资源(如消息队列中的数据)遗留在系统中,并且这些资源在程序结束后很长时间仍然在系统中游荡.shmat()成功返回返回共享内存的首地址,失败返回 NULL(像malloc一样给共享空间的起始地址),看帮助手册失败返回的是-1;key: 不同的进程使用相同的 key 值可以获取到同一个共享内存,(这里的值和信号量的值一样也没有关系,因为类型不一样;shmat()将申请的共享内存的物理内存映射到当前进程的虚拟地址空间上。

2024-05-18 15:09:22 569

原创 信号量实现进程同步

信号量就是控制某个进程能够对某个资源进行访问;保证同一时刻只能由一个进程对某个资源进程访问;信号量是一个特殊的变量,对信号量的操作都是一个原子操作;打印机信号量是一个特殊的变量,一般取正数值。它的值代表允许访问的资源数目, 获取资源时,需要对信号量的值进行原子减一,该操作被称为 P 操作。当信号量值为 0时,代表没有资源可用, P 操作会阻塞。释放资源时,需要对信号量的值进行原子加一,该操作被称为 V操作。信号量主要用来同步进程。信号量的值如果只取 0,1, 将其称为二值信号量。

2024-05-14 14:30:23 897

原创 Linux的IPC和管道

进程间通信(IPC机制)(Inter-Process Communication)进程间通信的方法:(1)管道 (2)信号量 (3)共享内存 (4)消息队列 (5)套接字。

2024-05-14 14:25:33 894

原创 c++常量类型

在C++中,常量的定义使用const。由于常量的值在程序运行过程中不能被改变,因此,定义或说明常量时必须对其进行初始化。常量包含内置类型常量、对象类型常量(常量对象)、引用类型常量(常量引用)、常量对象成员(包括常量成员函数和常量数据成员)和指针常量(常量指针)等。本节介绍常量对象、常量引用、常量成员。

2024-04-16 14:35:08 324

原创 c++友元

类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,而其他函数是无法访问类的私有成员的。但有时这种限制太严格,不适合特定的编程问题。C++提供另一种访问途径-友元。友元有3种:●友元函数●友元成员函数●友元类对于一个类而言,它的友元虽然不是该类的成员函数,但是可以访问该类的私有成员。

2024-04-16 14:25:27 306

原创 c++对象的拷贝构造和赋值

如果一个构造函数的第一个参数是类本身的引用,且没有其它参数(或者其它的参数都有默认值),则该构造函数为拷贝构造函数。拷贝(复制)构造函数:利用同类对象构造一个新的对象●1.函数名和类同名 (构造函数)●2.没有返回值 (构造函数)●3.第一个参数必须是类本身的对象的const 引用.可以有其它的参数,但其它参数必须有默认值,注意一般都只有一个参数.●4.不能重载class Foopublic:Foo();//默认构造函数//拷贝构造函数//...

2024-04-15 23:45:14 877

原创 c++向函数传递对象

C++语言中,对象作为函数的参数和返回值的传递方式有 3 种:值传递、指针传递和引用传递。

2024-04-15 23:42:18 634

原创 c++对象指针

对象指针在使用之前必须先进行初始化。可以让它指向一个已定义的对象,也可以用new运算符动态建立堆对象。

2024-04-02 21:45:01 383

原创 c++对象数组

定义对象数组、使用对象数组的方法与基本数据类型相似,因为类本质上也是一种数据类型。在定义对象数组时,系统不仅为对象数组分配适合的内存空间,以存放数组中的每个对象,而且还会为每个对象自动调用匹配的构造函数完成数组内每个对象的初始化工作,但数组结束时会自动调用每个对象的析构函数。局部变量(栈中)的数组,构造是从0下标开始往后进行,而析构是从后往前进。总结:数组中的每个对象都自动调用构造函数和析构函数。

2024-04-02 21:42:28 187

原创 C++析构函数

(5)如果没有定义析构函数,系统会自动生成一个默认的析构函数,这个析构函数不做任何事情。当对象的生存期结束时,系统就会自动执行析构函数清除其数据成员所分配的内存空间。(3)一个类有且仅有一个析构函数,必须为public。(4)在对象的生存期结束时,由系统自动调用析构函数。(2)析构函数没有参数、没有返回值,不能重载。(1)析构函数名是由“~”加类名组成的。//没有返回值,没有参数。

2024-04-01 20:01:27 137

原创 数组中重复的数字

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

2024-04-01 19:19:17 436

原创 vector和array区别

【代码】vector和array区别。

2024-03-30 20:33:38 157

原创 vector和c语言的数组的区别

在讨论C++中的vector和C语言的数组之间的区别时,需要注意以下几点:动态大小 vs. 固定大小:内存管理:容器功能:迭代器:

2024-03-30 20:11:02 205

原创 C++构造函数

构造函数是一种特殊的成员函数,专门用于构造新对象,并把数据赋值给它的成员。类内实现:类名(参数列表)函数体;类外实现:类名::类名(形参列表)函数体;

2024-03-27 20:04:24 137

原创 八大排序之堆排序

时间复杂度:O(nlogn),系数大,空间复杂度O(1),不稳定。

2024-03-27 19:57:33 1086

原创 C++对象的创建和使用

定义了类,就相当于定义了一个数据类型。类与int、char等数据类型的使用方法是一样的。可以定义变量,数组和指针等。使用类定义的变量通常称为该类的对象。对象定义一个引用变量,它们是共占同一段存储单元的,实际上它们是同一个对象,只是用不同的名字表示而已。因此完全可以通过引用变量来访问对象中的成员。对象的指针通过"->"访问它的成员变量和成员函数。对象通过"."访问它的成员变量和成员函数。2.对象的指针访问其成员。3.对象的引用访问其成员。

2024-03-26 22:46:42 283

原创 C++类的定义

类的定义格式如下:class 类名private:成员属性或成员函数protected:成员属性或成员函数public:成员属性或成员函数注:(1)class是声明类的关键字,class后跟类名。类名一般首字母大写。(2)类包括成员属性和成员函数。成员属性代表对象的属性;成员函数实现对象的行为。(3)private、protected和public关键字称为访问权限符,它规定了类中成员的访问属性。这3个关键字可以按任意顺序出现。默认时为私有的(private)。

2024-03-26 22:45:46 246

原创 c++编译时求值

通常情况,函数无法在编译时求值,因此也就不能在常量表达式中被使用。但通过将函数指定为constexpr,就能向编译器传递这样的信息,即,"如果调用函数时是用常量作为实参,则函数应该能用在常量表达式中"即在编译时求值(12.1.6 constexpr函数)。2.不能有局部变量,也就不能有循环(循环一定需要循环因子变量);//错误,n是变量,无法在编译时求值。//合法,Fac(5)在编译时求值。

2024-03-25 16:37:16 166

原创 c++列表初始化

初始化就是对象在创建时被赋值。//X表示类型,a1对象名,v初始值X a1{v};X a2 = {v};X a3 = v;X a4(v);第一种 X a1{v};是C++11提出的,在所有场景中都能使用,强烈建议大家使用。使用{}的初始化称为列表初始化。它还能防止窄化(收缩)转换。窄化(收缩)转换是指数据由宽变窄或者出现数据丢失的情况。如下代码//可以,但有警告//可能数据丢失//error,收缩转换//错误,收缩转换//可以//可以//可以//错误,收缩转换。

2024-03-25 16:36:20 848

原创 八大排序之选择排序

时间复杂度O(n^2),空间复杂度O(1),不稳定;快速排序如果完全有序就退化为选择排序。

2024-03-24 11:00:00 200

原创 八大排序之冒泡排序

时间复杂度:O(n^2),空间复杂度O(1),稳定。

2024-03-24 07:30:00 161

原创 c++new和delete

new是在堆区申请一块连续的内存空间,如果申请成功,则返回内存指针;如果申请失败,则返回NULL。new申请内存空间的过程,通常称为new一个对象。与 malloc()相比:1.new是关键字,不需要引用头文件(malloc需要引用stdlib.h或者malloc.h)2.new创建动态对象时会自动调用对象的构造函数;3.new能够根据初始化列表中的值进行初始化。下面介绍new运算符常见的几种用法。

2024-03-23 15:00:00 314

原创 C++string类

s1 = "趣字节,有趣的编程!!!//第一种方式,字符串赋值string s2 = "今天,好好学习了吗?//第二种方式,字符串初始化string s3{"你学废了吗?"};//第三种方式 ,用字符串构造stringreturn 0;第一种方式先定义了string变量s1,再为string变量s1赋值;第二种方式直接使用“=”为string变量s2赋值;

2024-03-23 10:30:00 220

原创 C++内联函数

当调用一个函数时,程序就会跳转到该函数,函数执行完毕后,程序又返回到原来调用该函数的位置的下一句。函数的调用也需要花时间,C++中对于功能简单、规模小、使用频繁的函数,可以将其设置为内联函数。内联函数(inline function)的定义和调用和普通函数相同,但C++对它们的处理方式不一样。如果一个函数被定义为内联函数,在编译过程中,C++将用内联函数程序代码替换对它的调用。

2024-03-22 20:23:52 172

原创 c++函数重载

让您能够使用多个同名的函数,"多态"指的是有多种形式,通常使用函数重载。函数重载的关键是函数的参数列表--也称为函数的特征标。C++允许定义同名的函数,前提是它们的参数列表(特征标)不同。参数数目或参数类型不同则参数列表(特征标)不同。求2个或3个整数的和,求2个或3个双精度浮点数的和。

2024-03-22 20:20:46 116

原创 八大排序算法之希尔排序

而我们通过这样的间隔式分组,可以实现,尽量让大数据在后面,肖书记在前面,通过5 3 1的三次分组,(注:最后一次必须是1的分组,因为我们要让所有数据有序)实现比插入排序时间复杂度低的排序。我们正常分组时候是这样直接挨着分组,每3个3个分组,这样导致我们分组之后,小的数字变化不大,大的数字变化也不大,而我们希望小的数字在前面,大的数字在后面,这样可以减少我们的时间复杂度;希尔排序是插入排序的进阶版本,他多次调用插入排序,在插入排序上进行了改造,使其处理无序的数据时候更快。理论基础为直接插入排序。

2024-03-21 11:07:34 793

原创 八大排序算法之插入排序

从当前位置开始,从后往前找比当前数字小的,找到后插入到这个小的数字后面,在找的过程中,如果发现一个比当前数字大,同时将这个数字往后挪。

2024-03-21 10:58:45 309

原创 八大排序算法之快速排序

找到一个基准(第一个数据),从后往前找比基准小的数据往前移动,从前往后找比基准大的数据往后移动,重复前两步,直到找到基准位置, 这是快速排序的一次划分,之后多次调用一次划分,直到完全有序。

2024-03-20 09:31:06 271

原创 KMP算法

KMP算法可以说是BF算法的升级版BF算法i回退,但是KMP算法最大的特点就是i不回退,由于i不会退,所以KMP算法的时间复杂度为O(n+m)

2024-03-19 11:16:35 314

原创 字符串与BF算法

(1)在主串str的pos位置查找子串sub,找到返回下标,未找到返回-1(2)思想:相等继续比较,不相等回退,回退时i推到刚才的位置的下一个(i-j+1)j退到0(3)利用子串是否遍历完成,来判断查找是否成功,注:不能利用主串来判断(4)算法时间复杂度BF:O(n*m)

2024-03-19 11:07:27 376

原创 数据结构:链式队列

1.带头结点,队头为第一个数据节点,队尾在最后一个数据节点2.头结点为一个队头指针,一个队尾指针,增加队尾指针可以让入队时间复杂度为O(1)

2024-03-19 10:59:26 194

原创 C语言实现图书管理系统

/定义两个全局变量用来记录所有的图书信息和读者信息。

2024-03-19 10:37:53 3401 2

原创 右值引用解释

/错误,不能引用临时变量。//错误,不能引用临时变量。C++11新增加的引用——右值引用(rvalue reference),使用&&声明。//error 右值引用不能引用const左值。//b = 100//error const引用的值不能修改。//error 右值引用不能引用左值。/*注意:const int& c = 1;右值引用与const引用的区别。

2024-01-15 21:00:12 388

原创 Linux的mybash

/mybash.creturn;return;return;int i=0;while(s!=NULL)return;return;if(pid==0)else\n");exit(0);//clear.cint main()0H");

2023-12-01 23:30:00 383

原创 Linux自己写一个bash

字符串分割函数注意:strtok线程不安全,原因就是函数实现使用了一个static的变量(指针记录下次分割的地址,再次调用要沿用上次的,所以需要静态变量).在多线程中,如果两个线程都使用了strtok的话,这个变量的值就会被另一个线程不定期的进行修改.(后面会讲);

2023-12-01 09:30:00 948

原创 Linux(fork+exec创建进程)

ececl,execlp,execle,execv,execvp //库函数execve //系统调用//pathname:新替换的程序的路径+名字//arg :传给新程序主函数的第一个参数,一般为程序的名字//arg 后面是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数//系统调用//前五个是库函数,最后一个是系统调用,所以本质上上面5个都是通过第六个系统调用实现的也就是说,上面5个都是调用的execve,不过都是。

2023-11-30 04:00:00 1120

原创 Linux信号

运行sleep 500这个进程,发现使用自己的mykill命令发送15号信号显示的是"已终止(Terminated)",发现使用自己的mykill命令发送9号信号是"已杀死(killed)",ctrl+z发送 SIGTSTP 信号(停止进程的运行, 但该信号可以被处理和忽略)给前台进程组中的所有进程,常用于挂起一个进程。内核可以进程发送信号,别的进程也可以给进程发送信号,自己也可以给自己发送信号;那么在这里,我们修改一下代码,让父进程收到子进程的代码,打印一下收到的信号代号,不要忽略掉;

2023-11-30 00:45:00 845

原创 队列基础(循环队列)

和栈相反,队列(queue)是一种先进先出(first in first out,缩写为FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素.在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front).1)队列:先进先出的一种线性结构,入队(插入)的一端称为队尾,出队(删除)的一端称为队头2)队列的存储方式有两种,一种为顺序结构(顺序队列),两一种为链式结构(链式队列)

2023-11-29 18:45:00 887

原创 链式栈基础

链栈栈顶:栈顶在表头(即第一个数据节点)(时间复杂度是O(1))(采用的是链表的头插法)

2023-11-29 14:34:15 859

原创 Linux僵死进程及文件操作

两个参数用于打开一个已经存在的文件;三个参数的用于新建一个文件,并设置访问权限;fd:对应打开的文件描述符buf:写入的文件内容;count:要写入多少个字节;返回值:ssize_t:实际写入了多少个字节;关闭文件描述符;

2023-11-29 04:00:00 2562

空空如也

空空如也

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

TA关注的人

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