- 博客(46)
- 收藏
- 关注
原创 shell - 编译 Readline 时对 “tputs“的 undefined reference
是缺少了libtinfo.a 库,增加包含即可解决问题。
2023-06-02 11:13:20
435
原创 360 的开源力作,超详细的编程规范指南
今天给大家推荐的开源项目是由 360 开源的「360 安全规则集合」,简称《安规集》,由 360 质量工程部主导,将编程时需要注意的问题总结成若干规则,可为制定编程规范提供依据,也可为代码审计或相关培训提供指导意见,旨在提升软件产品的可靠性、健壮性、可移植性以及可维护性,从而提升软件产品的综合安全系数。
2023-02-07 08:19:25
263
原创 new 重载用于内存泄漏检测
#include <stdio.h>#include <iostream>#include <vector>#include <numeric>#include<algorithm>#include <stack>#include <string>#include <map>using namespace std;class A{public: int a = 1;};...
2021-09-14 17:23:27
182
原创 makefile 增加定位信息打印的方法
方法一echo:这个方法需要用到tab键,如:%:[tab]@echo 222222222222222这个方法难免有点臃肿,而且最近在项目使用中发现容易失效,原因还没找到。方法二使用info warning error关键字,不需要tab键:使用info/warning/error增加调试信息info$(info “here add the debug info”)注,info信息,不打印信息所在行号warning$(warning “here add the debug
2021-04-09 15:22:38
262
原创 自旋锁实现机理 spin_lock
自旋锁的概念自旋锁(spin lock)是一种典型的对临界资源进行互斥访问的手段,它是基于系统原子操作为基础,自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图获得一个被已经持有(争用)的自旋锁,那么该线程就会一直进行忙循环-旋转-等待锁重新可用,要是锁未被争用,请求锁的执行线程就可以立即得到它,继续执行。先看一下自旋锁实现的数据结构:typedef struct { union { u32 slock; struct __raw_tickets { u16 owner;
2020-11-23 17:35:56
1872
原创 makefile 语法记录
= 是最基本的赋值:= 是覆盖之前的值?= 是如果没有被赋值过就赋予等号后面的值+= 是添加等号后面的值.c.o:这句话的意思就是%.o : %.c也就是说,所有的.o文件,依赖于对应的.c文件.c.o: //后缀规则。它告诉make 后面的命令 使用从.c文件生成.o$* //目标文件除去后缀的部分, 如果目标是xx.o, 那么=xx$< //依赖文件最左边的那个。如果依赖是 xx.c yy.c, 那么=xx.c 第一个依赖文件这些字符/字符串包括"$@",分...
2020-10-22 11:14:21
140
原创 makefile链接静态库
先来看个例子:先写一下实现加减功能的子函数。主函数要调用另一个c文件里面的函数,一般是通过共同包含同一个.h文件实现的。// filename add_minus.h#ifndef __ADD_MINUS_H__#define __ADD_MINUS_H__int add(int a, int b); int minus(int a, int b); #endif /*__ADD_MINUS_H__*/我们的功能函数add_minus.c:// filename a.
2020-10-21 17:24:10
6231
转载 C++里面的深拷贝和浅拷贝
//拷贝有两种:深拷贝和浅拷贝//1.结构体中的深拷贝和浅拷贝/* 浅拷贝:编译器仅仅拷贝了结构体的值,而没有创建新的内存空间,而是共享同一块内存空间。当结构体成员中含有buf的时候,拷贝之后释放内存就不会出现问题,但是如果结构体中含有指针变量时, 编译器就只会拷贝指针变量,而对应 的,内存空间却不会缺,不再多分配。深拷贝: 编译器会为拷贝的对象分配一定的内存空间 #include <iostream> using ...
2020-09-12 14:41:32
555
转载 c++中构造函数和析构函数的使用案例
前言: 最近自考C++刷题的时候快被构造函数和析构函数搞得疯掉了,现在特意写一篇博客来记录自己的收获!在我们创建新的对象的时候,都要执行某一个类中的构造函数,而当构造函数中分配了资源之后,当我们销毁一个对象的时候需要一个相应的操作将这些资源释放出去,这就需要析构函数。一般来说,在有基类和派生类存在时,在创建派生类类型时,会先构造基类,再构造派生类,析构顺序反之,类似于进栈出栈的过程。遇到的情况:指针不会调用构造和析构函数: ...
2020-09-12 11:04:43
1007
原创 TIME_WAIT状态
TIME_WAIT 定义:TCP 连接终止时,主机 1 先发送 FIN 报文,主机 2 进入 CLOSE_WAIT 状态,并发送一个 ACK 应答,同时,主机 2 通过 read 调用获得 EOF,并将此结果通知应用程序进行主动关闭操作,发送 FIN 报文。主机 1 在接收到 FIN 报文后发送 ACK 应答,此时主机 1 进入 TIME_WAIT 状态。TIME_WAIT状态的存在主要基于两个目的:1、实现可靠的连接终止。2、让老的重复的报文段在网络中过期失效,这样在建立新的连接的时将..
2020-09-10 18:27:13
277
翻译 linux 下coredump文件生成定位方法
基本概念 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core
2020-08-28 11:50:04
433
原创 git 切换分支报错:error: pathspec ‘origin/XXX‘ did not match any file(s) known to git
项目上有一个分支test,使用git branch -a看不到该远程分支,直接使用命令git checkout test报错如下:error: pathspec 'origin/test' did not match any file(s) known to git.解决方法:1、执行命令git fetch取回所有分支的更新2、执行git branch -a可以看到test分支(已经更新分支信息)3、切换分支git checkout test...
2020-08-14 15:04:10
728
1
原创 linux shell 命令整理
一、查看文件操作du -sh *[root@A23216010 /]# du -sh *0 bin182M boot8.0K dev61M etc7.2G home0 lib0 lib64
2020-08-11 14:58:50
104
原创 shell 命令取关键字第二列参数pid,配合popen实例,获取线程堆栈信息
ps -aT |grep queueTask |awk '{ print $2}'
2020-08-08 14:14:57
869
原创 写一个客户端程序和服务器程序,客户端程序连接上服务器之后,通过敲命令和服务器进行交互
题干请你分别写一个客户端程序和服务器程序,客户端程序连接上服务器之后,通过敲命令和服务器进行交互,支持的交互命令包括: pwd:显示服务器应用程序启动时的当前路径。 cd:改变服务器应用程序的当前路径。 ls:显示服务器应用程序当前路径下的文件列表。 quit:客户端进程退出,但是服务器端不能退出,第二个客户可以再次连接上服务器端。 客户端程序要求 1、可以指定待连接的服务器端 IP 地址和端口。 2、在输入一个命令之后,回车结束,之后等待服务器端...
2020-07-23 20:41:21
1409
1
原创 优雅/粗暴地关闭TCP连接--close-shutdown的选择
一个 TCP 连接需要经过三次握手进入数据传输阶段,最后来到连接关闭阶段。在最后的连接关闭阶段,我们需要重点关注的是“半连接”状态。 因为 TCP 是双向的,这里说的方向,指的是数据流的写入 - 读出的方向。比如客户端到服务器端的方向,指的是客户端通过套接字接口,向服务器端发送 TCP 报文;而服务器端到客户端方向则是另一个传输方向。在绝大数情况下,TCP 连接都是先关闭一个方向,此时另外一个方向还是可以正常进行数据传输。举个例子,客户端主动发起连接的中断,将自己到服务器端的数...
2020-07-21 17:05:51
5538
原创 输入一个字符串,以回车结束(字符串长度「=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
输入描述:多组数据。每组数据输入包括3行,第1行是包含多个单词的字符串 s,第2行是待替换的单词a,(长度<=100)第3行是a将被替换的单词b。(长度<=100)s, a, b 最前面和最后面都没有空格.输出描述:每个测试数据输出只有 1 行,将s中所有单词a替换成b之后的字符串。示例1输入You want someone to help youYouI输出I want someone to help you/*解题思路:先将s
2020-07-01 11:24:30
9722
4
原创 实现一个算法,删除单链表中间的某个结点,假定你只能访问该结点
实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。给定待删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true直接free(p),这样行不通,因为我们不能访问其他结点;如果我们只能访问该结点,可以尝试将该结点的后继结点的数据复制到当前结点,然后删除后继结点typedef struct SListNode { int value; // 保存的值 struct SListNode* next; // 保存下一个结点的地址}...
2020-07-01 10:26:42
490
原创 Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir
输入:输入:PopPeekMedianPush 3PeekMedianPush 2PeekMedianPush 1PeekMedianPopPopPush 5Push 4PeekMedianPopPopPopPop输出:InvalidInvalid322124453Invalid#define StackMax 100000typedef struct stack_array { unsigned int c...
2020-06-30 21:48:53
472
1
原创 栈空间大小不受限设计方法
typedef struct stack_mg{ unsigned int stack_count; // 栈的包含的数值 int struct stack_t *top; // 指向栈顶的位置}Stack_mg_t;//利用链表作为栈空间的节点数据结构,栈大小不受限typedef struct stack_t { unsigned int value; // 栈的值 int s...
2020-06-30 21:17:36
217
原创 链表:链表分割问题:以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前,分割后保持原来顺序不变
typedef struct SListNode { int value;// 保存的值struct SListNode* next;// 保存下一个结点的地址} SListNode_t; //编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前SListNode_t* compaerSListNode(SListNode_t* head, int key){ if( NULL== head) ...
2020-06-30 19:17:46
841
原创 TCP/IP三次握手总结
三次握手指的是客户端与服务器端的三次握手协议:TCP 三次握手的解读我们先看一下最初的过程,服务器端通过 socket,bind 和 listen 完成了被动套接字的准备工作,被动的意思就是等着别人来连接,然后调用 accept,就会阻塞在这里,等待客户端的连接来临;客户端通过调用 socket 和 connect 函数之后,也会阻塞。接下来的事情是由操作系统内核完成的,更具体一点的说,是操作系统内核网络协议栈在工作。下面是具体的过程:1、客户端的协议栈向服务器端发送了 SYN 包,并告诉.
2020-06-29 08:39:33
580
原创 写一个strncpy(char *dest, const char *src, size_t cpy_lent) 的函数
strncpy是个安全函数,相对于strcpy而言。这个函数我们会经常用到,面试的时候也会时不时考一下,今天写一个,一是总结,二是方便日后自己回顾。char * strncpy(char * dest,const char *src,size_t cpy_lent){ char *tmp = dest; while (cpy_lent-- && (*dest++ = *src++) != '\0') //这里涉及多个知识点,如"++"的优先级高于"*",这样的写法很巧妙,会将
2020-06-11 17:35:38
366
2
原创 /usr/bin/python^M: bad interpreter: No such file or directory 文件解决办法
很多情况下python作为脚本语言编写的脚本都是在windows上用IDE写好,自动化sync到linux服务器上,如果全部都是由IDE部署上去的一般不是很容易出问题,但是部署完之后在生产环境用vim稍作修改,往往会出现问题。如:#! /usr/bin/python# coding=utf-8... ...实际运行报错:/usr/bin/python^M: bad interpreter: No such file or directory仔细检查报错内容,并不会发现任何语句错误或者路径
2020-05-29 10:34:01
4886
原创 python 例子
python 语法优美,不是经常用,总结一片小的例子后续可以借鉴。#coding=utf-8#!/usr/bin/pythonimport osimport timeproject_table = {'ifconfig','cat log','tail -n log'}def handle_script(project_name): #获取时间打印 str_log = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(ti
2020-05-25 20:57:05
135
原创 IPV4 地址和整形转换程序实现
前言最近看道一个面试题目,大体意思就是将ip地址,例如“192.168.1.116”转换成int类型,同时还能在转换回去思路ip地址转int类型,例如ip为“192.168.1.116”,相当于“.“将ip地址分为了4部分,求其转换成int 型及:192*256^3 + 168*256^2 + 1*256 +116*1。int类型转ip地址,思路类似,除以权值即可,但是有部分字符串的操作#include <stdio.h>#include <stdlib.h&g..
2020-05-20 10:54:34
398
转载 快排算法--每趟找基准大小在基准两边
首先设置两个变量i,j。 分别指向序列的首尾元素。 该例子是以第一个元素为基准,从小到大进行排列。 让j从后向前进行查询,直到找到第一个小于66的元素。 则将最后一个j指向的数23,和i指向的66交换位置。 然后将i从前向后查询,直到找到第一个大于66的元素76. 将76和66位置互换。 让j从后向前进行查询,直到找到第一个小于6...
2020-03-18 21:03:46
1189
2
转载 Linux中父进程为何要苦苦地知道子进程的死亡原因? (转)
白发人送黑发人一个普遍的常识是,在Linux里面总是“白发人送黑发人”,子进程死亡,父进程透过wait等待子进程死亡,并清理子进程僵尸,当然父进程也可以因此而获得子进程的死亡原因。子曾经曰过:“Talk is cheap. Show me the code”,我们来看看实际的代码:上述代码中,子进程在第18行通过pause等待信号,父进程在代码的第22行通过waitpid等待子进程...
2020-03-16 08:17:01
404
原创 linux 利用shell将当前时间写入文件
#!/bin/bashecho `date +"%Y-%m-%d %H:%M:%S"` begin >> ./a.logecho `date +"%Y-%m-%d %H:%M:%S"` end >> ./a.log等到的结果:[root@A23205350 cen]# cat a.log 2020-02-20 16:41:11 begin2020-02...
2020-02-20 16:56:59
9697
1
原创 linux用户面进程分用户面内存和内核态内存,那么内核态进程的内存是如何呈现的?
首先疑问来源是是进程的内存分布:(来自:https://blog.csdn.net/ordeder/article/details/41654509)(这里需要通过极客时间上的刘超的讲解linux内存管理进行进一步细化)从而引发的疑问:那么内核态中的进程是如何区分自己的内存的?这里就有了经典的一句话,内核态中没有进程的概念?详细资料需要结合https://blog.csdn.n...
2020-02-04 21:33:02
225
原创 回溯算法求解,括号对数组合问题
给出n代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。例如,给出n = 3,生成结果为:[ "((()))", "(()())", "(())()", "()(())", "()()()"]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/generate-parenthe...
2019-11-21 10:29:10
578
转载 TCP的三次握手与四次挥手理解及面试题(很全面)
序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号seq就是这个报文段中的第一个字节的数据编号。确认号ack:占4个字节,期待收到对方下一个报文段的第一个数据字节的序号;序列号表示报文段携带数据的第一个字节的编号;而确认号指的是期望接收到下一个字节的编...
2019-10-21 10:59:29
104
转载 面试题--给40亿个不重复的,没有排过序,给一个无符号整数,如何判断这个数在这40亿个数中
如果常规的想法是给这40亿数,放到一个很大的数组中,快速排序,然后采用二分查找,来判断这个数是否存在;但是计算机的内存就是4G,大小差不多刚好是2^32大约为42亿左右,一个整形4个字节,40亿数大约需要16G个字节,在现实基本不可能实现,那么该如何存储呢?方法:位存储一个整形32个位,16G个字节只需要500M就可以,然后设置比特位1表示这个数存在,0表示这个数不存在。#inc...
2019-10-21 09:42:10
653
原创 利用c++ set 和c 解统计一条字符串中不同字符个数的方法
题目:统计字符中不同字符个数:输入:123456输出:6输入:11112222输出:2我们先来看传统c语言的实现方法:#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ char str[128] = {'\0'}; char str_stort[1...
2019-10-18 17:06:56
1595
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人