自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

加油吧,骚年

  • 博客(46)
  • 收藏
  • 关注

原创 二叉树的基本知识

基本代码:#pragma once#include <iostream>#include <queue>#include <assert.h>#include <stack>using namespace std;template <class T>struct BinaryTreeNode{ T _data; B...

2019-03-30 17:56:25 199

转载 回调函数应用

https://www.cnblogs.com/zhonglongbo/p/8410464.html

2019-03-26 21:05:34 540

转载 malloc calloc realloc三者区别

转载这篇文章,点击链接请看详情http://blog.csdn.net/shuaishuai80/article/details/6140979

2019-02-27 23:51:03 204

转载 linux查看C结构体定义

今天写程序时,用到了pthread_cond_timedwait 函数,其原型为:int pthread_cond_timedwait(pthread_cond_t *restrict cond , pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime); 最后一个参数是 timespec 结构体,可惜m

2018-01-06 13:50:44 1400 1

转载 TCP的7种定时器

我们知道TCP是面向 连接 的, 可靠 的, 流式 传输的协议, 在TCP的里面有7种定时器, 分别是:1.建立连接定时器(connection-establishment timer) 2.重传定时器(retransmission timer) 3.延迟应答定时器(delayed ACK timer) 4.坚持定时器(persist timer) 5.保活定时器(keepalive tim

2017-08-02 14:21:05 798

原创 TCP的三次握手和四次挥手

一.TCP数据报报头如下所示: 和UDP协议一样也有源端口号的目的端口号,通信的双方由Ip地址和端口号标识。 32位序号标识和32位确认序号标识:保证全双工 16位窗口大小: 4位首部长度的数值表示TCP协议头的长度,以4字节为单位,最小值为5,二进制序列为0101,最大值为15,二进制序列为1111,因此TCP协议头最短为4*5 = 20(不带任何选项);最长可以是4*15=60字节。(

2017-08-02 13:21:15 193

原创 调研端口

端口调研分类 1.简述端口 端口号是用来标识目的主机当中唯一的一个网络进程,Ip地址是用来标识Internet网上唯一的一台主机号,Ip地址+端口号等于套接字,套接字可以确定唯一的一个进程。 Tcp/ip协议中引入一种叫做“套接字”的应用程序软件,有这种技术,一台电脑就可以与任意一台具有套接字的电脑通信。 2端口的分类: 从性质上来分: (1)公认端口:0—1024,紧密绑定一些特定的服

2017-07-22 20:19:21 270

原创 求二进制序列中1的个数

二进制序列中1的个数

2017-06-12 19:08:37 561

原创 调研死锁知识

参考:http://blog.163.com/yanenshun@126/blog/static/128388169200982444858590/?fromdm&fromSearch&isFromSearchEngine=yes(一)死锁概念(1),背景知识 首先该明白什么叫同步与互斥以及什么是互斥锁? 同步: 按照特定顺序访问临界资源,在互斥基础上实现。 互斥:对临界资源的访问时串行式

2017-06-11 20:44:58 301

原创 linux多线程编程1

(一).线程概念1.线程是程序执行流的最小单元,是进程内部的执行分支,一个进程内有多个线程。 2.vfork创建子进程,在调用exec和exit(程序终止)之前,子进程会在父进程的地址空间内运行。 3.linux下没有描述线程的结构体,所以并没有真正意义的线程,进程有PCB(task_struct 结构体),而线程没有。但是在windows下有真正意义上的线程,有描述线程的结构体TCB。 4.

2017-06-10 21:51:41 284

原创 进程间通信(IPC)---共享内存

我们知道每个进程都有一个自己的PCB和一个地址空间,每个进程间是相互独立的,无法相互看到对方的地址空间,因此就不能通信,但是为了能达到进程间通信,人们发明了许多方法,共享内存是其中之一。(一)共享内存的原理进程间通信的本质是使不同的进程可以看到同一份资源,这份资源称之为临界资源,那么这里的共享内存即是这份临界资源。所以,首先应该创建一段共享存储区。然后使其要访问这个共享存储区的每一个进程都要将该共享

2017-06-09 21:05:52 372

原创 进程间通信----消息队列

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

2017-06-09 16:22:55 327

原创 进程间通信----信号量

信号量的本质是一种数据操作锁或叫它计数器,它本身不具有数据交换的功能,而是通过控制其他通信资源(文件,外设)来实现进程间通信的。它本身也是一种临界资源,,能被多个进程同时看到与访问,但是为了访问的正确性,必须保证访问的元子性。 补充知识: (1)临界资源: 不同进程能够看到的一份公共的资源,且一次仅允许一个进程使用的资源称为临界资源。,比如两个进程都要访问硬盘,那么硬盘就是临界资源。

2017-06-07 19:45:02 485

原创 进程间通信----管道

一,进程间通讯原理每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程间交换数据,必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这个机制称为进程间通信(IPC) 二,进程间通信——管道(一),匿名管道匿名管道是一种最基本的IPC进制,由pipe函数创建:#include <unistd.h>

2017-05-30 17:05:38 877

转载 Linux下的文件描述符

转载请说明出处:http://blog.csdn.net/cywosp/article/details/389652391. 概述    在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统

2017-05-22 19:56:23 1161

转载 C语言中的FILE结构体

内存中的数据都是暂时的,当程序结束时,它们都将丢失。为了永久性的保存大量的数据,C语言提供了对文件的操作。1、文件和流C将每个文件简单地作为顺序字节流(如下图)。每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中。当打开文件时,就建立了和文件的关系。在开始执行程序的时候,将自动打开3个文件和相关的流:标准输入流、标准输出流和标准错误。流提供了

2017-05-20 21:51:10 30037 2

原创 linux下的atexit()函数

很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit() 结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就 是用atexit()函数来注册程序正常终止时要被调用的函数。atexit()函数的参数是一个函数指针,函数指

2017-05-20 20:08:40 349

原创 僵尸进程和孤儿进程

一,基本概念 我们知道在linux/unix 中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程,子进程的结束和父进程的运行是一个异步过程,即父进程永远不知道子进程什么时候结束,当一个进程完成它的工作终止后,它的父进程需要调用wait()和waitpid()系统调用取得子进程的终止状态。孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将

2017-05-18 20:21:56 761

转载 Vim的配置

1.什么是vimvim是Linux下一种常用的编译器,但是和VS相比,它确实有点low了,但是呢,我们可以通过配置,把它变的和VS一样好用。下面就介绍一下简单的配置。2.vim的简单配置在root下,你可以在etc目录下找到一个vimrc文件,里面就写着vim的配置,如下图 我们配置就在当前用户下就好,在普通用户下输入命令 cd~/ 然后你可以看一下当前目录下有没有一个 .vimrc 文件,ll

2017-05-05 19:02:32 188

原创 浅析迭代器失效

什么是迭代器失效呢,首先迭代器的失效是指在容器内进行插入元素或者删除元素之后,迭代器不能正常的访问或遍历数据,使其失去了本来的功能。我们常见的迭代器失效,比如在vector 的插入数据和删除数据,会导致迭代失效,,在链表里删除数据时,也会导致迭代器失效,,今天我们重点看在vector和list里的迭代器失效。 一,vector中删除一个元素,会导致迭代器失效,,具体看图 那么我们该如何解决

2017-05-04 00:47:57 816

原创 浅析智能指针

说到智能指针,就必须得先知道RAII,因为智能指针是RAII的一种应用,RAII 其实就是资源分配即初始化,,定义一个类来封装资源的分配和释放,在构造函数中完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。那么我们为什么要用智能指针呢?我们不是已经学了分配资源和清理资源的动态内存管理的标识符new 和delete了吗?,完全够用了啊,为什么还要用智能指针呢,因为我们

2017-05-01 17:07:18 299 1

原创 linux下的进程描述符task_struct

一,数据结构 进程控制块PCB,是进程存在和运行的唯一标志,在linux中用task_struct这个结构体来表示。这个结构体中有许多数据项,查看源代码时没必要理解全部数据项,只需要在以后使用时在理解struct task_struct{ ...}下面重点介绍几个基本的数据项:1.进程状态 task_struct中用长整形state表示进程的状态。volatile

2017-04-16 22:48:09 308

原创 linux 下的进度条的实现

首先介绍下linux 下进度条实现的原理 第一点,利用行缓冲刷新,要知道这点,首先得知道 /n,和/r的区别;/n 表示回车换行【先将光标移动到下一行,然后将光标移动到当前行的开头】,/r表示回车【将当前光标移到当前行的开头】,还要明白计算机内存刷新方式有 无缓冲【从输入设备输入一个数据,不在缓冲区逗留,直接输出在输出设备上】,行缓冲【从输入设备输入一个数据,放在缓冲区中,当遇到换行符,则刷新在输

2017-04-16 19:16:38 254

转载 c语言里缓冲区的理解

从一个简单的例子开始:[cpp] view plain copy print?#include <stdio.h>  int main()  {      char a[20] ;      char str[20] ;      printf(”请输入文件名:”) ;      scanf(”%s” , a ) ;        printf(”请输入关键字:”) ;      //getcha

2017-04-16 18:49:05 18632 8

原创 linux下的权限粘滞位

通常情况下用户只要对某个目录具备w写权限,便可以删除该目录下的任何文件,【注意: 只要目录有w权限,就可以删除该目录下的任何文件】 而不论文件的权限是什么。 现在我们举个例子看看 首先在超级用户下创建一个目录test,并其在test里面touch一个file的文件,如图 然后修改test权限,使其变为777 然后返回普通用户,,看能不能删除file 你会惊奇的发现竟然删除的。。

2017-03-31 20:42:22 250

原创 linux下的find指令

linux 下的find的指令非常强大,基本上可以支持各种方式的查找,因此它的选项也特别多,学起来也不是那么的容易,今天我简单的把自己知道的选项总结一下;首先我在自己的code目录下面建立五个文件,它们都不一样,以便一会能准确的查找,如图 1.按权限664方式查找,看结果 2.按文件名称查找,看结果 3.接下来我们按user来查找,看结果 4.接下来按字节大小查找,我们查找100

2017-03-31 18:00:34 227

原创 探究继承+virtual与不加virtual在对象内存中的分配

第一个没有加 virtualclass A{public: int _a;};class B : public A{public: int _b;};class C : public A{public: int _c;};class D : public C, public B{public: int _d;};int main(){

2017-03-26 16:28:08 632

原创 linux下的access,modify,和change

首先让我们先创建一个code目录,然后touch一个file文件,然后stat一下, 你会发现出现了我所说的三个时间(红框框里面的),当然你现在不知道他们是干什么用的,那么接下来我们进入文件中在里面写一写代码,然后在stat,你会发现时间惊奇的改变了, 所以可以知道第一条结论> 1.vim会是三个时间都同步,记录下一改变文件的时间然后我改变文件属性,即权限,会发生什么变化呢; 你

2017-03-26 10:59:20 456

原创 逆序<作业题>

有一个字符数组的内容为:”student a am i”,请你将数组的内容改为”i am a student”.要求:不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。tneduts a ma i -> i am a student 代码如下#include <stdio.h>#include <assert.h>#include <windows.h>void str_swi

2017-03-24 23:56:35 197

原创 模拟实现memmove

#include <stdio.h>#include <assert.h>#include <string.h>char* my_memmove(char* dst,char* src, int len){ char* d = dst + len; char* s = src + len; assert(dst && src); if (src<dst &&

2017-03-24 23:52:43 165

原创 模拟实现atoi函数

#include <stdio.h>#include <ctype.h>#include <assert.h>#define INT_MAX 100000#define INT_MIN -100000int my_atoi(char* str){ int ret = 0; //用于返回 int flag = 1;

2017-03-24 23:46:30 261

原创 实现bubble_sort<冒泡法>

自己实现一个bubble_sort(冒泡排序),可以完成不同类型数据的排序。#include <stdio.h>int compare(void* elem1,void* elem2){ return (*(int*)elem1)-(*(int*)elem2);}void bubble_sort(int * arr,int sz,int (*cmp)(void* elem1,void*

2017-03-24 23:40:28 289

原创 qsort 排序

使用qsort排序一个整型数组,一个浮点型数组,一个字符串数组。#include <stdio.h>#include <stdlib.h>int Compare(void* elem1,void* elem2){ return (*(int *)elem1)-(*(int*)elem2);}void Print(int * arr,int sz){ int i = 0;

2017-03-24 23:36:55 268

原创 c++实现单链表

#define _CRT_SECURE_NO_WARNINGS 1#pragma once//单向链表#include <iostream>#include <assert.h>using namespace std;typedef int DataType;struct ListNode{ DataType _data; ListNode* _next; List

2017-03-24 23:20:00 191

原创 C和Cpp里面的动态内存管理

c动态内存管理c语言里面的动态内存管理函数,介绍的有4个,分别是malloc, realloc,calloc,和free,其函数原型分别如下void *malloc(size_t size); void *calloc(size_t num_elements,size_t element_size); void realloc(void ptr,size_t new_size); void

2017-03-12 12:22:57 543

转载 main函数命令行参数

C程序最大的特点就是所有的程序都是用函数来装配的。main()称之为主函数,是所有程序运行的入口。其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用的是有参函数,则参数在调用时传递。C/C++语言中的main函数,经常带有参数argc,argv,如下:int main(int argc, char** argv)int main(int argc, char* ar

2017-03-10 00:17:07 489

转载 如何快速转载CSDN中的博客

前言  对于喜欢逛CSDN的人来说,看别人的博客确实能够对自己有不小的提高,有时候看到特别好的博客想转载下载,但是不能一个字一个字的敲了,这时候我们就想快速转载别人的博客,把别人的博客移到自己的空间里面,当然有人会说我们可以收藏博客啊,就不需要转载,(⊙o⊙)… 也对。。实现  因为我自己当初想转载的时候却不知道该怎么转载,所以学会了之后就把方法写出来,帮助那些想转载却不知道该怎么转载的人(大神勿笑

2017-03-10 00:06:15 226 1

原创 浅谈宏与函数的区别

宏与函数我将从五个方面来谈谈它们的区别,理解了这5个方面,我们就能知道该在什么情况下使用它们,就能更好的写出高效的代码了。1.代码长度> 宏代码是直接插入到程序中,代码出现多次,除了非常小的宏之外,宏能使程序的长度大幅增加。> 函数代码只出现在一个地方,每次使用这个函数时,都调用那个地方的同一份代码。2.执行速度> 宏的执行速度更快,直接插入的。> 函数的返回与调用存在额外的开销,速度慢一些。3

2017-03-09 00:27:30 301

原创 模拟实现strcmp函数

strcmp为字符串比较函数,其函数原型为int strcmp( const char *string1, const char *string2 ); 其功能是用来比较两个字符串,设这两个字符串为str1,str2,若str1=str2,则返回零;若str1< str2,则返回负数(一般为负1);若str1>str2,则返回正数(一般为正1)。 思路:把两个字符串的字符(ASCII码)一个一个

2017-03-07 00:17:11 893

原创 c语言模拟实现strcat

strcat也是字符串操作函数,是用来拼接字符串的,其库函数原型为 extern char *strcat(char *dest, const char *src) ,具体事例如下; 例如:有char *str1 = “abcd”,char *str2 = “1234”,strcat (str1,str2)可以将1234连接到abcd后面,结果是abcd1234,并且存放在str1中,当然str

2017-03-05 17:34:18 425

空空如也

空空如也

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

TA关注的人

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