- 博客(51)
- 收藏
- 关注
原创 简单线程池C语言实现
一个简单线程池的实现一、什么是线程池?线程池的官方定义: 线程池是一种成熟的线程使用模式。实现由领导者与跟随者模式,半同步半异步模式。线程池的伸缩性对性能有较大的影响。创建太多线程,将会浪费一定的资源,有些线程池未被充分使用。销毁太多线程,将导致之后浪费时间再次创建它们。创建线程太慢,将会导致长时间的等待,性能变差。销毁线程池太慢,导致其他线程资源饥饿。 二
2018-01-31 13:39:55
1480
原创 创建守护进程
创建守护进程一、什么是守护进程? 是指在后台运行的,没有控制终端与之相连的进程,它独立于控制终端,通常周期性地执行某种任务。二、怎么创建守护进程?1. 让进程在后台执行。方法:调用fork或vfork生成一个进程,然后父进程退出。 2.调用setsid创建一个新会话(目的是为了摆脱终端)。控制终端、登录会话和进程组通常是从父进程继承下来的,守护进程要摆脱它们,不受它们的影响。方法:
2018-01-18 19:44:23
426
原创 僵尸进程和孤儿进程
什么是孤儿进程和僵尸进程?一、孤儿进程1. 什么是孤儿进程: 如果一个子进程的父进程先于子进程结束,则该子进程将变成孤儿进程。它将由init进程收养,成为init进程的子进程。 通俗来说,就是父亲(父进程)去世了,儿子(子进程)成了孤儿(孤儿进程),然后儿子被孤儿院(init进程)收养。2. 怎么产生孤儿进程:#include #include
2018-01-18 13:30:33
483
原创 进程基础
进程基础一、什么是程序: 为了执行某一特定任务的一系列指令的有序集合。程序 = 代码段 + 数据段二、什么是进程:从用户角度看: 进程是程序的一次执行过程` 从操作系统角度看:> 1. 进程是分配CPU,内存、时间片等资源的基本单位 2. 进程是操作系统分配资源的最小单位 3. 进程有自己的执行状态进程 = 程序 + 堆栈 + PCB(进程控制块)三、进
2018-01-18 10:57:03
386
原创 旋转数组中最小数字
一、题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1 。二、题目分析: 这道题最直观的解法即从头到尾遍历一遍数组,我们就能找出最小的元素。但这种方法的时间复杂度显然是O
2018-01-05 22:13:57
449
原创 使用两个栈来实现队列
一、问题描述: 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入借点 和在队列头部删除结点的功能。 template class MyQueue { public: MyQueue(void);
2018-01-05 11:39:42
251
原创 error LNK2001: unresolved external symbol(使用类模板时出现该错误)
一般使用类模板出现该错误,如果不是其他变量名或函数名书写错误的话,那么就很可能是将类模板的声明文件和实现文件分开了! 解决方法: 将类模板的声明和实现写到一个头文件中!
2018-01-05 11:23:23
598
原创 根据给定先序和中序序列来重建二叉树
一、问题描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。如果输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,15,38,6},则重建出对应的二叉树。二叉树结点的定义如下: struct BinaryTreeNode {
2018-01-04 21:41:40
1008
原创 逆向打印单向链表的所有结点
一、题目描述: 输入一个链表的头结点,从尾到头反过来打印出每个结点的值。 链表结点定义如下: struct ListNode { int m_nKey; ListNode *m_pNext; };
2018-01-04 19:24:51
500
原创 替换字符串中的空格
一、题目描述: 请实现一个函数,把字符串中的每个空格替换成 "%20"。例如输入"I love you.", 则输出"I%20love%20you."。并且时间复杂度为O(n)。二、解题思路: 我们最容易想到的解决方案是:从头开始遍历字符串,遇到空格,则将其后面的所有字符向后移动3个字符位置。但我们发现,在移动的过程中一部分字符移动了多次。这并不符合时间
2018-01-02 22:24:17
618
原创 在一个行和列都为升序的二维数组中找一个数字
一、问题描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数。 例如: 二维数组: 1 2 8 9 2 4 9 12
2018-01-02 16:50:43
949
原创 虚函数表
一、虚函数的工作原理(虚函数表) 通常我们在类中编写了虚方法后,编译器是怎么来处理呢? 编译器处理虚函数的方法是:给每个对象加一个隐藏成员。这个隐藏成员中保存了一个指向函数地址数组的指针。这个数组称为虚函数表vtbl(virtual function table)。这个指针就叫虚表指针! (1)、虚函数表存储什么呢?
2017-12-15 13:16:47
632
2
原创 Linux中tree命令的C语言实现
一、tree命令是干什么的? 我们经常用tree命令来查看指定目录下的目录文件结构,并以树状结构显示。二、明确需求: 1、显示目录下的所有文件 2、遇到目录则要进入目录,并显示该目录下的所有文件 3、显示需要使用树状层次显示三、编程思路: 、很明显这是一个递归过程,遇到目录则递归
2017-12-10 11:52:00
7423
2
原创 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libmysqlclient.a(libmysql.c.o): In function
在CentOS系统中编译mysql程序,出现这种错误: usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libmysqlclient.a(libmysql.c.o): In function `fetch_float_with_conversion':(.text+0x7ce): undefined reference
2017-12-07 22:02:14
13649
2
原创 怎么计算struct结构所占空间?
C语言结构体struct所占空间的计算一直是公司笔试题中的热点。 struct的空间计算较为复杂,总体上遵循两个原则: (1)、整体空间是占用空间最大的成员(的类型)所占字节数的整数倍。 (2)、数据对齐原则---内存按结构体成员的先后顺序排列,当排到该成员时,其前面已摆放的空间大小必须是该成员类型大小的整数倍,如果不够则补齐,依次
2017-12-05 13:56:32
1768
原创 关键字decltype和volatile简单说
一、引入关键字decltype decltype是C++11标准新增的关键字,下面介绍这个关键字的主要用途: 问题描述:C++98标准中,编写模板函数时,一个问题是并非总能知道应在声明中使用哪种类型。下面示例: template void ft (T1 x, T2 y) {
2017-12-05 11:28:55
535
原创 通用Makefile的编写和在项目工程中使用Makefile(包括动态库、静态库的链接、整个工程联合编译)
一、通用Makefile文件的编写 (1)、什么是通用Makefile? 这里的通用Makefile指的是它既能编译可执行文件、也能编译动态链接库、又能编译静态库,只需要更改很少的内容即可。 (2)、写一个通用Makefile#-------------------------配置区域------
2017-12-03 14:51:27
8067
4
原创 Makefile的编写规则
一、什么是Makefile? 通俗来说,Makefile就是一个文本形式的文件,其中包含一些规则告诉make编译哪些文件以及怎样编译这些文件。然后通过make命令来逐步执行Makefile定义好的编译规则。 Makefile带来的最大的好处就是:" 自动化编译 ",一旦写好了Makefile,只需要一个make命令,整个工程完全自动编译,极大的提高了软件项
2017-12-02 22:24:20
1105
原创 Linux中gdb程序调试器的命令使用(包括后台进程和多线程的调试)
一、什么是gdb? gdb是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 gdb中的命令固然很多,但我们只需要掌握其中最重要的十几个命令,就大致可以完成日常的基本的程序调试工作。 no symbol table is loaded二、怎么进入gdb调试模式? 不是什么可执行程序都是可以用gdb
2017-12-02 20:35:25
734
原创 C++函数模板的隐式实例化、显式实例化与显式具体化
一、什么是实例化和具体化? 为进一步了解模板,必须理解术语实例化和具体化。 (1)、实例化:在程序中的函数模板本身并不会生成函数定义,它只是一个用于生成函数定义的方案。编译器使用模板为特定类型生成函数定义时,得到的是模板实例。这即是函数模板的实例化。 而函数模板实例化又分为两种类型:隐式实例化和显式实例化例如:template
2017-11-29 21:48:58
2874
5
原创 vim最常用的命令集合
最常用命令集合:普通模式: i 从光标所在位置开始进入插入模式 I 光标回到所在行首,进入插入模式(i 的大写) a 从光标所在位置的下一个字符处进入插入模式 A 光标回到所在行尾,进入插入模式 o 向光标所
2017-11-26 21:20:05
295
原创 Shell脚本实例(二) 向指定目录下不断产生指定大小的文件
一、问题描述: 向一个指定的目录下面不断产生指定大小的文件二、解决思路: 、根据题目关键字 "指定目录"、 "指定大小",所以该程序肯定有两个参数,一个参数指定目录,一个参数指定大小 、还有一个关键字 "不断产生",所以程序主体肯定是一个死循环 、最后一个关键字 "产生文件",怎么产生文件?
2017-11-26 17:14:52
1786
原创 Shell脚本实例(一) 监控一个程序的运行情况
一、问题描述: 监控指定程序是否运行,如果程序没有运行,那么启动程序。二、解决思路: 、我们判断一个程序是否运行,可以通过查看该程序的进程信息来判断。 例: 判断程序 01FirstScript.sh 是否在运行 命令:ps -ef | grep 01FirstScri
2017-11-26 16:31:43
12334
2
原创 Shell脚本的基本语法(二) 预定义特殊字符、case语句和函数调用
一、Shell中有许多预定义的特殊字符: $n :n是一个数字(大于10则用大括号括起来,${12}),代表程序的第n个参数 $# :总共有多少个参数 $* :指所有的参数 $@ :指所有的参数 $? : 上次命令执行的返回值 注意:我们发现$*和$@的意思是一样的,其实它们
2017-11-26 14:55:46
1354
原创 Shell脚本的基本语法(一) if判断、for循环、while循环和until循环
这次来介绍一下Shell的基本语法:一、注释 Shell中的注释标志是井号 "#",除了脚本文件第一行的#不是注释之外,其他地方出现#,则说明#开始,到本行的末尾都是注释二、指定脚本解释器 一般每个Shell脚本文件的第一行都是指定脚本解释器 #!/bin/bash : 指定本脚本文件使用bash脚本解释器解释执行
2017-11-26 14:13:32
16199
6
原创 什么是Linux的Shell脚本和怎么执行脚本?
一、什么是Shell? shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。二、什么是脚本? 脚本就是由Shell命令组成的文件,这
2017-11-26 12:17:46
8110
1
原创 安装Linux学习必备软件
一、装机必备软件都有哪些? 、首先,在工作的时候我们不可能在Linux服务器上直接操作(安全起见),所以我们要通过远程登录来进入Linux服务器,然后在远程登录界面上进行操作。 有很多的远程登录软件,比如XSell、SecureCRT等等。但安装这些软件的前提是Linux系统上必须安装远程登录服务 openssh-server!(安装软件
2017-11-26 10:49:12
4906
原创 Linux系统常用命令(新手)
首先介绍最重要的命令: man 手册(后面可以跟命令名,也可以是函数名) 作用:查看该命令或函数名的所有相关信息。 例如: man ls 查看ls命令的所有相关信息命令: ls :显示指定目录下的所有文件(目录也是文件) 默认情况下,ls显示当前目录下的所有文件,也可以 l
2017-11-24 10:21:38
1755
原创 排序算法(七) 2路归并排序
一、什么是归并排序? 归并排序的特点体现在 “归并” 上,“归并” 就是“合并”!将两个或两个以上有序的序列合并为一个有序的序列。而2路归并就是将两个有序序列合并为一个有序序列。二、一个2路归并排序的图例:三、由上图得出归并排序思路: 、怎样合并两个有序序列(在后面程序中给出) 、实现归并算法:将r1[ ] 中的元素用归并法排序后放到 r3[
2017-11-23 17:16:13
1590
原创 函数指针的使用
一、为什么要有函数指针? 函数与数据项相似,函数也有地址。我们希望在同一个函数中通过使用相同的形参在不同的时间使用产生不同的效果。二、怎么获取函数的地址? 获取函数的地址的方法很简单:只要使用函数名(不用跟参数)即可。 例如: 函数: void function( int a) ; 则f
2017-11-21 14:04:01
13234
原创 一些可变长度对象(string对象、vector对象 ...)作为结构体或类的成员,会不会动态改变结构体或类所定义的变量的大小呢?
可能是我自身的原因,经常性的杞人忧天! 在接触到C++的一些类时,想的有点多了。事实证明,我确实想多了。但是我觉得可能会有和我一样会多想的小伙伴,我在这分享一个我想多了的栗子! 以前,C语言写结构体时。结构体成员都是基本类型,比如int、char、double之类的,最多也就里边再套一个结构体成员,但它们都有一个特点。它们的大小是固定的,我不会有这样的担心。
2017-11-21 13:23:38
1507
原创 怎样让一个函数有不定长的参数列表?(附代码实例)
一、什么是可变参数列表? 我相信只要学过C语言,就一定用过 scanf() 和 printf() 两个标准库函数。用过的朋友都知道,这两个函数功能强大无比,能输入输出各种各样类型的东西!scanf() 能支持整型、浮点型、字符型等等类型的输入,而且与之对应的输出函数printf() 也能支持整型、浮点型、字符型等等类型的输出 !它是怎么实现的呢?是不是有什么厉害的法宝、大杀器?
2017-11-20 09:45:57
1421
原创 通过求斐波那契数理解递归的恐怖开销!
一、什么是递归? 递归的本质就是函数的自我调用,就是自己调用自己。 众所周知,递归是一种解决问题强有力的技巧。在描述有些问题时有不可替代的优势,但滥用递归很可能造成资源的巨大开销!二、递归函数调用涉及哪些运行时开销? 、参数必须压到堆栈 、函数内部定义的局部变量的值也要压栈保存 、函数的执行状态(寄存器的值
2017-11-19 22:28:04
350
原创 排序算法(六) 堆排序
一、什么是堆排序? 堆排序也是一种选择类排序,但它选择元素的方式和简单选择排序大不相同。 它将待排序数组看成一个完全二叉树,并通过建立大根堆或小根堆的算法使之成为一棵特殊的完全二叉树。为什么说其特殊呢? 用大根堆完全二叉树来说,任何一个结点的值大于等于它的左右子树的根的值。而小根堆完全二叉树恰好相反,任何一个结点的值小于等于它的左右子树的根的值。 举
2017-11-19 16:49:55
602
原创 排序算法(五) 简单选择排序
一、什么是选择类排序? 顾名思义,选择类排序的核心就是“选择”,为什么选择呢?怎么样选择呢? 选择类排序的基本思路就是: 在待排序序列中选择一个最小(最大)的元素出来,并将之放到合适的位置上,最终将待排序序列变成一个有序的序列。二、有哪些选择类的排序算法? 根据选择元素的方式不同,我们讨论两种选择类排序算法:简单选择排序和堆排序。
2017-11-18 20:11:50
458
原创 排序算法(四) 希尔排序
一、引入希尔排序 通过理解直接插入排序的算法,我们可以发现算法的时间耗费主要在查找合适位置和移动元素为待排元素腾位置。因此,直接插入排序算法,在待排序的元素序列基本有序且序列元素较少时,其性能最佳! 而希尔排序就是利用了直接插入排序最佳性能的两个性质,因为它可以通过算法实现使序列越来越有序(不到最后一步,都不是真正有序)且元素较少!所以在时间耗费上,希尔排序
2017-11-18 19:52:23
436
原创 排序算法(三) 直接插入排序与折半插入排序
一、什么是插入类排序? 插入类排序默认有一个已经排好序的序列,而后面的操作就是将未排好序的元素有序插入到已排好序的序列中。 将所有未排好序的元素插入到合适位置,即可得到一个有序序列。二、需要了解的几类插入类排序算法。 (1)、直接插入排序 直接插入排序是一种基本的插入排序算法。算法思路很简单!以升序为例:
2017-11-18 17:09:30
1137
原创 排序算法(一) 冒泡排序
冒泡排序是最简单的排序算法,至少我是这样。我会的第一种排序就是冒泡排序,这个排序算法思路简单,而且代码很简洁,唯一的缺点就是效率低一些。但对于新手来说,也不失为一种容易上手的排序算法!一、什么是冒泡排序: 见文知意,冒泡排序。冒泡排序的关键就是冒泡!冒什么样的泡呢? 按升序排列就是冒最大数那个泡,按降序排 列就是冒最小数那个泡!二、算法描述:
2017-11-17 20:45:55
298
原创 排序算法(二) 快速排序
一、什么是快速排序? 快速排序是对冒泡排序的改进,本质上都是通过交换两个元素来消除逆序。 在冒泡排序中,由于扫描过程中只对相邻的两个元素进行比较,因此在互换两个相邻元素时只能消除一个逆序。 而在快速排序中,能通过两个不相邻的元素的交换,消除待排序记录中的多个逆序,则速度较冒泡排序有极大的提高。二、快速排序实现算法思路: (1)
2017-11-17 18:28:19
345
原创 两个大数相加
我们以前计算两个整数的和,需要定义两个整型变量来存储两个操作数。 但是,若这两个数大到任何整型类型都存放不下时,我们该怎么来计算它们的和呢?这就是我们今天所讨论的话题!解决思路: (1)、存储问题:我们可以使用字符串来存储操作数,这样不管操作数有多长都能放得下。 (2)、计算问题:自定加法时,我们要考虑每一位的相加,还有相加时是否有进位值产
2017-11-17 10:40:55
630
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人