自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 编译过程

程序运行始末1.编译器将组成程序的每一个源代码(.c)文件经过编译器complier分别编译为目标代码(Windows ->.obj;类Unix->.o),然后由链接器linker包含头文件(用户自定义头文件.h 或.hpp与引用库里的头文件.h)和所有目标代码生成一个单一的可执行文件(.exe).执行exe文件时,由操作系统将文件内容加载进内存, 预处理prepressing ...

2018-04-30 22:21:16 450

转载 网络编程sys/socket.h

include define PF_UNIX PF_LOCAL /* POSIX name for PF_LOCAL. */define PF_INET 2 /* IP protocol family. */_type常见取值为: SOCK_STREAM SOCK_DGRAMeg: int listenfd; listenfd = socket(PF_INET, SOC...

2018-04-30 22:15:57 8257

原创 mysql的用户权限设置

mysql用户权限设置GRANT ALL PRIVILEGES ON . TO ‘zx_root’@’%’ IDENTIFIED BY ‘xpar’ WITH GRANT OPTION;

2017-12-02 17:48:55 294

原创 C++日期类的实现

AVL树又称为高度平衡的二叉搜索树,是1962年有俄罗斯的数学家G.M.Adel’son-Vel’skii和E.M.Landis提出来的。它能保持二叉树的高度 平衡,尽量降低二叉树的高度,减少树的平均搜索长度。 AVL树的性质 1. 左子树和右子树的高度之差的绝对值不超过1 2. 树中的每个左子树和右子树都是AVL树 3. 每个节点都有一个平衡因子(balance factor–bf),任

2016-09-20 21:29:10 452

原创 互斥锁与条件变量

互斥操作:   对共享资源的访问, 要对互斥量进行加锁, 如果互斥量已经上了锁, 调用线程会阻塞, 直到互斥量被解锁. 在完成了对共享资源的访问后, 要对互斥量进行解锁。   死锁主要发生在有多个依赖锁存在时, 会在一个线程试图以与另一个线程相反顺序锁住互斥量时发生. 如何避免死锁是使用互斥量应该格外注意的东西。   总体来讲, 有几个不成文的基本原则:   对共享资源操作前一定要获得锁

2016-09-16 23:05:50 508

原创 串行与并行

串行与并行程序或程序段在系统中有两种执行方式。一种是顺序执行,一种是并发执行。但是很多时候我们写的是串行的程序,而操作系统确实又要并发执行程序,这往往会产生一些让程序员感到“很奇怪”的错误。本文就LINUX下和WINDOWS下的并发问题进行了讨论,从例子中可以看到操作系统确实是在并发执行程序。 1、 问题提出: 很多人在调试程序的时候发现,单独运行一个程序实体时能够得到正确的结果,当同时运行两个

2016-09-16 21:18:45 4529

原创 前台进程和后台进程

操作系统中,前台进程和后台进程有什么区别?特征是什么?后台程序基本上不和用户交互,优先级别稍微低一点 前台的程序和用户交互,需要较高的响应速度,优先级别稍微高一点直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗时,且用户也不急着需要结果的时候。假设用户要启动一个需要长时间运行的格式化文本文件的进程。为了不使整个shell在格式化过程中都处于“瘫痪”状态,从后台启动这个进程是明智的选择

2016-09-16 21:13:42 1624

原创 大数据之位图法简单实现

所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。 举个栗子,给定40亿个整型数据,现在给一个整数,要求判断这个数在不在这40亿个数据中,先计算一下,40亿个整型,存储占用160亿字节,约16G内存,现在一般的个人计算机有2G和4G的内存,是无法直接计算的,如果分批进行操作,那么开销也非常大。如果使用位图,用一个位标志

2016-09-12 13:55:56 1409

原创 贪心算法和动态规划

贪心算法 1.贪心选择性质 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。在动态规划算法中,每步所作的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能作出选择。而在贪心算法中,仅在当前状态下作出最好选择,即局部最优选择。然后再去解作出这个选择后产生的相应的子问题。

2016-09-10 23:31:53 730

原创 Linux下的死锁及产生条件

死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程(线程)在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

2016-09-10 23:19:42 641

原创 Linux下的守护进程与创建方法

1、我们先来了解一下什么是守护进程? 守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是生存期长的一种进程。它们常常在系统引导装入时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。2、守护进程的特点: (1)Linux系统启动时会启动很多系统服务进程,守护进程没有控制终端,不能

2016-09-10 17:50:13 437

原创 Linux中crond服务与crontab用法

crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。 Linux下的任务调度分为两类,系统任务调度和用户任务调度。 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到

2016-09-09 23:34:39 343

原创 Linux下进程间通信之共享内存

共享内存是进程间通信的一种方式,顾名思义,共享内存就是两个或多个进程共享一块内存。 共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。 但要特别注意的

2016-09-08 23:25:36 437

原创 Linux下进程间通信之信号量

信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要

2016-09-08 17:16:30 487

原创 线程安全与可重入函数

首先,什么是线程安全?什么又是线程不安全呢? 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。 线程安全问题都是由全局变量及静态变量引起的。若每

2016-09-08 16:35:19 362

原创 Linux下进程间通信之消息队列

消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值。我们可以通过发送消息来避免命名管道的同步和阻塞问题。消息队列与管道不同的是,消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定是入先出。消息队列与命名管道有一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上

2016-09-07 00:05:30 366

原创 Linux下进程间通信之命名管道

管道实现通信的方式简单易懂,但一个不足之处就是管道没有名字,因此,只能用于具有亲缘关系的进程间通信,在命名管道(named pipe或FIFO)提出后,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。命名管道是一个设备⽂文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。值得注意的是,FI

2016-09-06 17:10:08 395

原创 Linux下的进程间通信之管道

在Linux下,每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到所以进 程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication). 1、管道(pipe) 管道是一种最基本的IPC机制,由

2016-09-06 15:51:22 398

原创 在Linux下进入目录,目录下创建、修改、删除文件所需权限

首先,我们用root权限建立一个目录名为dir, 此时文件拥有者对改目录具有读、写和执行权限,所属组和other对改目录具有读和执行权限。现在去除dir的所以权限, 此时dir目录的所有权限都不存在,但root用户依然可以进入目录,以及可以在dir目录下创建、修改和删除文件。但普通用户则不可以。 进入超级用户模式,我们给dir的other赋予读权限,再切换为普通用户,发现依然无法进

2016-09-01 00:35:20 4225

原创 Linux进程创建之fork()v与fork()

在Linux下创建进程有多种方法: 1、fork()#include<unistd.h>pid_t fork(void)//成功返回0,失败返回-1fork()函数是Unix中派生新进程的唯一方法,但在Linux下不是。调用一次fork()方法,该方法会返回两次。一次是在调用进程(也就是派生出的子进程的父进程)中返回一次,返回值是新派生的进程的进程ID。一次是在子进程中返回,返回值是0,代表当

2016-08-28 00:23:51 497

原创 file结构体中的重要字段

struct file结构体定义在include/linux/fs.h中定义。文件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的 struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。在内核创建和驱动源码中,struct file的指针通常被命名为file或filp。 下面说一下file

2016-08-27 21:45:33 577

原创 Linux的粘滞位

粘滞位(Stickybit),或粘着位,是Linux文件系统权限的一个标志位。普通文件的sticky位会被linux内核忽 略,但目录的sticky位表示这个目录里的文件只能被owner和root删除。 最常见的用法,在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件。如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动其中的文件。

2016-08-26 20:39:00 403

原创 Linux进程管理

在linux中每一个进程都由task_struct数据结构来定义. task_struct就是我们通常所说的PCB.她是对进程控制的唯一手段也是最有效的手段。当我们调用fork() 时, 系统会为我们产生一个task_struct 结构。然后从父进程,那里继承一些数据, 并把新的进程插入到进程树(一般采用红黑树)中, 以待进行进程管理。tsak_struct的结构比较复杂,大致结构如下图:每个进程都

2016-08-25 22:39:07 295

原创 Linux基本命令之find命令

find命令是Linux下一个使用频率比较高的命令。常常用它在系统特定目录下,查找具有某种特征的文件。 find命令的格式:find [-path……] -options [-print -exec -ok] path:要查找的目录路径。 ~ 表示$HOME目录 . 表示当前目录 / 表示根目录 print:表示将结果输出到标准输出。 ex

2016-08-23 23:15:31 990

原创 Linux下文件的三种时间标记

在Window环境下的文件有三种时间,即创建时间、修改时间和访问时间,在Linux下文件也有三种时间,为修改时间,访问时间和状态改动时间。 这两种环境下的文件时间有所不同,Linux环境下没有文件创建时间这个概念,如果文件没有被修改过,那么文件的创建时间和修改时间就相同,如果文件状态没有被修改过,也没有被读取过,那么文件创建时间也等于访问时间和状态改动时间。 由于不能判断文件是否被访问

2016-08-21 23:34:03 1216

原创 c++之封装——string类型的实现

以前在C语言中并没有string这个内置类型,但是到了c++里面就可以使用了,c++中可以定义string变量,对string类型的变量可以进行各种操作,包括相加、相减、赋值等等,就和int ,double类型相似,但string是一个字符串。要实现这些操作并不像C语言的内置类型一样那么简单,直接数据进行运算就可以。 string的实现得益与c++的封装特性,封装是c++的三大特性之一,s

2016-08-04 01:00:37 3073

原创 c++函数模板

要写一个通用的函数,比如说各种类型数据的加法,如何实现呢?对,我们学过函数重载。 int Add(const int &_iLeft, const int &_iRight){return (_iLeft + _iRight);}float Add(const float &_fLeft, const float &_fRight){return (_fLeft + _fRight);

2016-07-21 12:16:20 349

原创 c++多态

大家都知道c++有三大特性,封装、继承、多态,个人认为多态是最为难理解的。对象分为静态模型和动态模型 多态,字面理解就是一个事物有多种形态。多态也分为静态多态和静态多态,静态多态有函数重载和泛型编程,函数重载即相同函数名,不同参数列表的多个函数,而泛型编程是一种模式,泛型,即是把数据类型作为一种参数进行传递。泛型编程的典型泛型编程的代表作品STL,是一种高效、泛型、可交互操作的软件组件。

2016-07-13 10:37:49 330

原创 c++继承

继承,是c++三大特性之一。 概念:继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。 继承的代码格式如下: DeriveClassName为派生类名,又称子类,继承类型分为共有继承,保护继承和私有继承三

2016-07-12 11:10:22 332

原创 斐波那契数列的几种求法

斐波那契数列:1,1,2,3,5,8,13,21,34.........要求数列的第n项解法一:利用两个变量,具体做法如下:int Fbnq(int n){ int a = 1; int b = 1; if (n <= 0) { return 0; } if (n == 1||n == 2) { return 1; } for (int i = 1; i

2016-06-15 17:01:47 654

原创 类和六个默认函数及this指针

类,c++中用关键字class来进行定义,类似于C语言中的结构体,来写一个简单的类

2016-06-01 13:30:12 636

原创 顺序表及相关操作

线性表是用一组地址连续的存储单元依次存储一组数据,特点是每个数据元素的存储位置相邻其结构体定义如下:#define MAX_SIZE 1000 //顺序表的最大容量#define INIT_SIZE 2 //顺序表的初始大小

2016-05-24 11:24:39 360

原创 单链表及其基本操作(C语言实现)

单链表是一种基础线性数据结构,其结构分为数据域和指针域两部分,数据域用于存放数据,可以是一个整型,一个数组,一个结构体等等,指针域用于存放一个指针,指向下一个链表节点,每个节点通过指针联系,其物理地址不一定连续。单链表节点的结构体如下:typedef struct Node{ DataType data; //数据域 struct Node *next; //

2016-05-22 12:50:50 1931

原创 整形数组的奇偶元素分类

一个整形数组,姑且先将其中的元素都当做正整数,举个例子{1,2,3,4,5,6,7,8,9}.现在要求将数组中的奇数放到数组的前面部分,将偶数放到数组的后面部分,该怎么实现呢? 此题并不难,很容易找到一定的思路,我的第一种想法是遍历数组,对于每一个数,如果是奇数就放到数组前面,从第一个开始,否则放到数组后面,从最后一个开始。代码如下void sort(int *arr, int sz)

2016-05-08 22:36:53 942

原创 杨氏矩阵查找

有这样一种矩阵,其每一行的元素依次递增,每一列的元素也依次递增举例如:1,2,32,3,43,4,5这样的矩阵称为杨氏矩阵,现在要在矩阵中查找某个元素是否存在,要求返回元素下标该怎么做呢?最简单的做法,把这个矩阵放到二维数组中,把这个数组遍历一遍,找到该元素就返回下标,否则返回空

2016-04-26 12:02:38 458

原创 左旋字符串的做法

字符串“abcdef”左旋一次得到“bcdefa”,左旋两次得到“cdefab”,那么给一个字符串,给定要旋转的字符串个数,如何实现这个函数呢?   最容易想到的思路是这样的:  每次旋转一个字符,一共旋转k次,画图演示一下,先创建临时变量将a的值保存一下,然后依次将b的值拷贝到a的位置,c的值拷贝到b原来的位置,依次类推直到f拷贝到e原来位置,再将保存过的a放到f原来的位置,至此左旋

2016-04-24 18:08:30 392

原创 逆置字符串之三步翻转

对于翻转字符串这个问题,想必大家都觉得很简单,设置两个下标指向字符串头尾,交换下标指向位置内容,左下标加,右下标减,直到下标相交。实现代码也很简单,不超过10行。void reverse(char*left, char*right) { while (left < right) { char tmp = *left; *left = *right;

2016-04-21 14:55:34 581 1

原创 str系列函数

str系列函数

2016-04-16 14:53:35 977

原创 游戏三子棋

最近写的一个作业题,类似于五子棋,但是还不如五子棋,是三子棋,哈哈哈,还没有写五子棋的水平,也许什么时候有空了钻研一下。很简单的逻辑,画出一个3*3的棋盘,然后人机对战,当然也可以人与人对战,稍微改写一下函数就行了。在九个格子里放置字符数组的值,开始时数组为空,按坐标放置棋子,每放一颗棋子判断棋盘上有没有三行或者三列或者三斜的相同棋子,若有,就判断谁赢,没有就继续下,直到棋盘放满还没有人赢得话

2016-04-06 00:24:15 482

转载 vs2013调试技巧及快捷键

VS2013快捷键很多,灵活使用常用快捷键及各项技巧可以让你事半功倍。下面的visual studio 2013快捷键和操作技巧你知道多少?  1.回到上一个光标位置/前进到下一个光标位置  1)回到上一个光标位置:使用组合键“Ctrl + -”;  2)前进到下一个光标位置:“Ctrl + Shift + - ”。  2.复制/剪切/删除整行代码  1)如果你想复制一整行代码

2016-03-31 13:29:09 10537

空空如也

空空如也

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

TA关注的人

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