自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 vscode通过多个跳板机连接目标机(两种方案亲测成功)

ssh -VProxyJump命令行使用方法多层跳板机用,隔开,顺序从左至右vscode中config配置,不想输密码可搜怎么设置公钥。

2024-03-13 15:37:08 1681

原创 C/C++实现常见排序(快排,希尔,插入,选择,冒泡)

一、快速排序(不稳定排序)基本思路:确立一个基准值(一般为最左边或者最右边),定义一个left和一个right,当基准值确定为最左边时,right先移动,反之left先移动,每趟排序实现左边全部小于基准值,右边全大于基准值,递归执行,最后一趟当left大于right时排序完成。常见实现有挖坑法和双指针法;void mqsort(int *arr, int L, int R) { if (L >= R) return ; int left = L;

2022-04-15 21:18:55 1051

原创 浅谈动态多态实现原理

简介:如果一个类中声明有虚函数,大多数编译器就会为这个类创建一个虚函数表(virtual function table)简称虚表(vtab)。 虚表中存放了该类中所有虚函数的地址,虚表属于整个类,不属于某个具体的对象,该类所有对象共享虚表。当实例化该类对象时,会自动把该类虚表的首地址(简称为 虚指针 vptr)存在该对象中,当使用基类指针/基类引用 调用该虚函数时,大概的过程为:基类指针/基类引用 -》具体对象 -》虚指针 -》 虚函数...

2022-04-13 20:33:44 539

原创 俄罗斯方块开发板重构版

简介:之前写过一篇俄罗斯方块在ubuntu上用ANSI控制码运行的文章,因为没有可移植性,并且没有考虑信号处理函数的可重入性,当方块下落速度较快时,可能导致程序崩溃,在此基础上用frmaebuffer和多线程并发来对以前程序进行重构。代码:game.h#ifndef GAME_H__#define GAME_H__#define ROW 19#define LINE 14#define DIA 4#define BASE 7#define SPINSTA 4//方块函数,

2022-04-12 23:31:59 430 1

原创 C程序的存储空间布局

系统空间:为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。内核总是驻留在内存中,是操作系统的一部分。系统中所有进程对应的虚拟地址空间的内核区都会映射到同一块物理内存上(系统内核只有一个)。命令行参数区:存储进程执行的时候传递给 main() 函数的参数,argc,argv []。环境变量:存储和进程相关的环境变量,比如:工作路径,进程所有者等信息栈(stack):存储函数内部声明的非静态局部变量,函数参数,函数返回地址等信息,栈内存由编译器自动分...

2022-04-11 20:20:54 658

原创 C++学习笔记5:运算符重载

一:基本概念c++中的运算符(+ - * / ....< > ... << >> ...)可以直接作用于基本类型(char ,int ,double ..)和标准库定义的类型(string...)但是这些运算符不能直接作用于我们自定义的数据类型,这个时候就要重新赋予这些运算符新的功能,使之能够直接操作我们自定义类型,这就是运算符重载。c++中所有运算符重载都是使用函数实现的,所以运算符重载的本质就是函数重载。运算符重载函数的格式如下: 返回值类...

2022-04-11 19:26:23 1181

原创 vescosd下vim配置及输入法自动切换

我的vim配置 "vim.leader": "<space>", "vim.easymotion": true, "vim.incsearch": true, "vim.sneak" : true, "vim.useSystemClipboard": true, "vim.useCtrlKeys": true, "vim.hlsearch": true, "vim-surround": true, "

2022-04-11 12:00:10 827

原创 C++学习笔记4:静态成员和常成员

静态成员 静态成员变量/属性 用关键字 static 修饰的成员变量/属性,称之为静态成员变量/属性 静态成员变量属于类,而不是属于某个具体的对象,某个类创建了多个对象,这个静态成员变量也只有一份数据, 属于类,多个对象共享它静态成员变量使用前要进行初始化操作,初始化操作只能在类外进行。类型 类名::静态成员变量名 = 初始值;不仅可以用对象名进行访问,还可以使用类名对其进行访问在类定义中,前面有static...

2022-04-05 19:50:22 2535

原创 C语言实现流媒体广播项目

一、简介一个简单的流媒体项目,基于客户端/服务器模型(C/S)开发,采用UDP组播技术,实现MP3格式音乐广播系统。服务器端采用多线程处理频道信息,实现媒体库(MP3)读取并进行流量控制(令牌桶),并通过UDP组播发送;客户端采用多进程,实现父进程接受来自网络的数据,通过进程间通信技术管道发送给子进程,子进程进行数据解码并输出到特定频道。项目简略图:-由于是一个广播系统,C/S之间的通讯采用无连接的udp组播,组播相对于广播更加灵活并且节省资源,故采用组播技术- 由于需要考虑到节目单频

2022-04-05 17:49:11 2026

原创 Makefile使用心得总结(实现简单的外部构建)

本篇文章主要是博主日常学习中使用的Makefile的经验总结,内容跨度比较大,不建议没有接触过Maekfile的博友们食用,如果有疑问可以评论留言;一、简单的比较通用的Makefile模板适用于目标只有一个且源文件和.h文件在同一目录下的情况,大体如下:.├── Makefile├── friend.cpp├── friend.h├── main.cpp├── mystring.cpp└── mystring.hMakefile编写如下(以上述文件举例)/* 目标名

2022-04-03 15:42:46 723

原创 C++学习笔记3:拷贝构造和移动构造

一、拷贝构造函数1、拷贝构造函数的语法: 拷贝构造函数名字(const 类名& ) {} 拷贝构造函数名字 -> 类名 形参列表:拷贝构造函数的第一个参数必须是本类对象的 const引用。 如果还需要其他的参数,那么必须要设置默认值(c++ 11新标准)当没有实现拷贝构造函数的时候,编译器会自动生成一个,函数体内不是为空,而是执行逐个成员赋值以自己简单实现的string类来举例:cl...

2022-03-31 20:40:48 4393 1

原创 C++学习笔记2:构造函数与析构函数

构造函数一、普通构造函数构造函数是一种特殊的成员函数,它主要用于为对象分配空间,进行初始化。构造函数的名字必须与类名相同,而不能由用户任意命名。它可以有任意类型的参数,但不能具有返回值。它不需要用户来调用,而是在建立对象时自动执行。class score {public: score(int m, int f); /* 构造函数 */ void setScore(int m, int f); //inline void showScore();private

2022-03-29 20:59:24 781 1

原创 C/C++混合编程

c++是兼容c语言的:c++中可以直接调用c语言库函数,应该也要能够调用自己写的c语言函数,像这种在c++代码中调用c语言函数的形式,称之为混合编程用c开发的功能很多已经用c编译器编译成库文件了,那么库文件中的函数名已经确定下来了(c语言编译器不会进行改名操作)直接用c++代码去调用该库的某个函数,由于c++编译器的改名操作,就会因为函数名字不匹配而导致失败.例子:sum.cint sum(int x,int y){ return x+y;}--------------.

2022-03-29 20:15:53 1153

原创 C++重载原理

为什么C++支持函数重载,而C语言不支持?编译一个可执行文件要经过:预编译,编译,汇编,链接这些阶段原因就出在编译完之后的汇编阶段,因为在这里C++和C语言有所不同,C++会进行一个改名操作,而C语言不会:C语言编译器编译之后:名字和函数名保持一致。C++编译器编译之后:总结:1.其实归根到底,还是因为C编译器和C++编译器对函数名的修饰不同。在gcc下的修饰规则是:【_Z+函数长度+函数名+类型首字母】。2.这其实也告诉我们为什么函数的返回类型不同,不会构成函数重载,因

2022-03-23 15:56:26 963

原创 C++学习笔记1:引用

引用(reference)是C++对C的一个重要扩充。变量的引用就是变量的别名,因此引用又称别名。类型 &引用名 = 已定义的变量名引用与其所代表的变量共享同一内存单元,系统并不为引用另外分配存储空间。实际上,编译系统使引用和其代表的变量具有相同的地址。引用并不是一种独立的数据类型,它必须与某一种类型的变量相联系。在声明引用时,必须立即对它进行初始化,不能声明完成后再赋值。为引用提供的初始值,可以是一个变量或者另一个引用。指针是通过地址间接访问某个变量,而引用则是通过别名.

2022-03-23 15:28:19 1130

原创 守护进程的编程规则(加入系统日志)和改进

守护进程:一般是指 Linux中的后台服务进程,它是一个生存周期较长的进程,如其父进程为init进程,通常独立于控制终端,即 不接受电脑用户的直接操作。守护进程是一个特殊的孤儿进程。会话(session): 会话是一个或多个进程组的集合。通常一个会话开始于 用户登录,终止于用户退出,在此期间用户运行的所有进程都属于会话进程组:每个进程除了有一个进程ID之外,还属于一个进程组。进程组是一个或多个进程的集合。每个进程组有一个组长进程,组长进程的进程ID等于进程组ID。如果调用setsid()的进程不

2022-03-21 17:36:38 154

原创 select定时器的简单实现

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); void FD_CLR(int fd, fd_set *set);//从指定的文件描述符集合中删除指定文件描述符fd int FD_ISSET(int fd, fd_set *set);//判断文件描述符fd 是否存在于文件描述符集合set中 void...

2022-03-21 17:17:32 950

原创 mmap函数使用实例

NAME mmap, munmap - map or unmap files or devices into memorySYNOPSIS #include <sys/mman.h>/* 映射,返回值为映射到的最终地址。addr: 目标内存空间 放到当前进程空间的起始地址,若为空,则函数自己找可用的位置length:需要映射目标空间的长度port : 映射过来的内存属性,即可以对该内存做什么操作,即映射后的操作权限 PROT.

2022-03-21 17:10:11 466

原创 clion通过ssh远程连接ubuntu进行linux下的C/C++开发

第一步:找到设置中的工具链,点击添加第二步:选择远程主机 ,点击选择配置第三步:用ifconfig查看ubuntu或者想要连接的 linux系统的ip地址第四步:填好配置信息后,点击测试连接第五步:点击向上箭头将配置好的工具链顶到最上方第六步:点击工具中的部署中的配置第七步:选择刚刚部署好的主机中的映射,映射的路径即clion和远程主机可以同步的地方第八步:点击工具中的启动ssh会话即可远程连接ubuntu..

2022-03-13 22:12:51 13114 7

原创 sigaction函数的使用和优点

NAME sigaction, rt_sigaction - examine and change a signal actionSYNOPSIS #include <signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);signum: 所要操作的信号.

2022-03-13 21:39:41 612

原创 信号的响应过程

内核为每个线程都维护了 两个位图:mask和pending信号屏蔽字 mask:用来表示当前信号的状态,mask初始值一般全部都是1pending位图: 用来记录当前进程收到哪些信号,一般初始值全部都是0在程序运行时间片耗尽时,被内核的中断机制打断时,程序保存当前的执行现场,进入到内核态的就绪队列等待就绪,当再次获取时间片时,从内核态回到用户态期间程序会将mask位图 按位与上pending位图来判断是否接收到信号,当没有信号时,位图结果为0,表示没有收到信号,程序回到之前的执行现场...

2022-03-13 21:16:51 1185 5

原创 select函数缺陷分析

与poll和epoll不同,select函数是事件为单位组织文件描述符,监视的行为较为单一。函数原型:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);1、每次调用都需要重新设置fd_setselect中布置监视任务的位置和返回监视的结果位置存放在同一空间,一旦监视行为发生,函数返回,其它集合会被清空。2、频繁的从用户态切换内核态进行拷贝,效

2022-03-10 23:24:52 646

原创 Posix标准有名信号量和无名信号量的使用

一、有名信号量 在文件系统中有一个名字 即有一个对应的inode节点 ,但是信号量的内容(值)确实存在于内核中 ,一般可以用于任意线程或进程间。 有名信号量的操作一般有: sem_open sem_wait/sem_post sem_close sem_unlinksem_t *sem_open(const char ...

2022-03-04 16:12:50 726

原创 mplayer播放器管道重构版

主要实现及功能:1,播放,暂停及继续,上一页下一页,上一首下一首和退出2,歌曲结束根据播放模式来自动下一首3,可根据不同格式导入歌曲4,ANSI控制码实现简单的界面制作5, 通过管道来向mplayer播放器发送指令6, 在播歌曲滑动显示主要技术点:父进程捕捉SIGCHLD信号通过信号处理函数wait收尸来获得mplayer的退出状态,当mplayer正常结束时,信号处理函数创建一个分离的线程重新打开mplayer播放器根据播放模式来自动播放下一首,main线程通过temp

2022-03-04 14:42:47 761 7

原创 Linux下c实现ls

主要功能及实现:1,使用命令行参数分析,暂时只支持 -l -a -n ,可混合使用或不使用2,对于隐藏文件目前只考虑 . 和 ..源代码如下:/************************************************************** > File Name: myls.c > Author: LuoLiang > Mail: 1204553475@qq.com > Created Time: 2022年01.

2022-01-16 16:50:39 602

原创 linux下c语言用mplayer实现简单的音乐播放器

主要功能及实现:1,播放,暂停及继续,上一页下一页,上一首下一首和退出2,以简单的并发来实现顺序播放等功能3,可根据不同格式导入歌曲4,ANSI控制码实现简单的界面制作缺点:1,未处理歌名太长覆盖界面的问题2,上一页,下一页只经过简单处理,不是很方便以下只对几个关键代码单独展示,完整源代码见文章末尾:一、带路径的歌曲名导入链表利用glob函数解析目录下的音乐名字并导入链表/* 歌曲路径和名字导入链表 */static LList_st *loading

2022-01-16 16:43:06 7910 5

原创 vi/vim基本命令和操作

vi/vim vi/vim是linux中最基本、最常用、功能非常强大的命令行编辑器 vim是vi的一个升级版本 vi有两种工作模式: 命令模式: 键盘上所有的输入字符都被当做是一个命令(快捷键) 如: 用vi打开一个文件,按d键,并不会有d的字符出来 此时d被当做是一条命令 输入模式: 键盘上所有的输入字符都被当做...

2021-12-30 11:43:11 514

原创 Linux下c语言实现有色界面俄罗斯方块

本文俄罗斯方块实现主要思路:把方块看做一个4x4的小数组在规定界面(看做一个大数组)内移动,用简单的信号控制并发,做到方块边下落边响应键盘的操作。本代码运用ANSI控制码来实现方块和界面的上色,提供从文件读取并更新历史最高分,暂停游戏,根据等级加快方块下落速度等功能,具体效果如下图所示:本文为博主第一次发表文章,不懂的地方可以留言,都会回复,喜欢的可以点赞收藏,代码不足的地方欢迎大家提出建议和改进方法 ,大家共同进步,以下为代码实现:函数声明:#ifndef GAME_H__#de.

2021-12-29 15:15:12 5111 9

空空如也

空空如也

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

TA关注的人

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