自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【C++】实现顺序表、单链表和双向链表

1. 实现顺序表#pragma oncetypedef int DataType;class SeqList{public: SeqList() :_array(NULL) ,_size(0) ,_capacity(0) {} SeqList(const SeqList& s) { _array = (DataType*)malloc(sizeof(Dat

2017-08-10 16:47:55 267

原创 【C++】string 类

1、完成String类普通版深拷贝和简洁版深拷贝 2、在上述String类中完成如下函数(要求不能调用C中的库函数): size_t Size()const; char& operator[](size_t index); const char& operator[](size_t index)const; String operator+(const String& s); bool operator>(const String& s); bool operator<(const

2017-08-03 16:28:35 318

原创 【Linux】shell 语法

1. 条件测试:test 和 [ 命令 test 或 [ 可以测试一个条件是否成立,如果测试结果为真,则该命令的退出码为 0,如果测 试结果为假,则命令的退出码为 1 (与C语言的逻辑表示正好相反)。 当我们在进行比较时,不能使用 C 语言风格的 ==、!= ,而要使用 -eq(等于)、-ne(不等于)、-gt(大于)、-ge(大于等于)、-lt(小于)、-le(小于等于)。 $? 表示上一条命令的退出码,echo $? 查看命令结果成功与否。0 真,非 0 假。

2017-07-14 17:22:43 306

原创 【Linux】进度条

1. 基本语法2. 进度条实现普通进度条:实现彩色进度条:这里的 m 值即 color 采用了取模运算, 是为了让进度条八种颜色不断变换达到彩色效果。进度条颜色设置:shell 脚本中 echo 显示内容带颜色显示,echo 显示带颜色,需要使用参数 -e ,-n

2017-07-14 10:37:52 321

原创 【网络】URG 和 PSH 标志位

和 UDP 协议一样也有源端口号和目的端口号,通讯的双方由 IP 地址和端口号标识。32 位序号、32 位确认序号、16 位窗口大小。4 位首部长度 IP 协议头类似,表示 TCP 协议头的长 度,以 4 字节为单位,因此 TCP 协议头最长可以是 4x15=60 字节,如果没有选项字段,TCP 协议头最短 20 字节。URG、ACK、PSH、RST、SYN、FIN 是六个控制位,16 位检验和将 TCP 协议头和数据都计算在内。

2017-07-13 23:28:16 418

原创 【Linux】命令代换

1. `` 和 $() 由反引号 `` 括起来的也是一条命令,Shell 先执行该命令,然后将输出结果立刻代换到当前命令行中。例如定义一个变量存放 date 命令的输出:命令代换用 `` 表示:DATE=`date`命令代换也可以用 $() 表示:DATE=$(date)

2017-07-12 22:54:18 231

原创 【Linux】epoll 服务器

vim epoll_server.c运行结果如下:

2017-07-12 17:37:47 213

原创 【Linux】TCP 三次握手与四次挥手

1. TCP 连接建立与释放2. 为什么要三次握手?第一次握手:        客户端先发送一个 SYN 请求(SYN=1 表示该报文是一个连接请求报文),发送的序号 seq=x(x 是系统自己选定的大小),SYN 虽然不携带数据但是会消耗一个序列号。当客户端的 SYN 请求发送出去之后,客户端进入 SYN-SENT 状态。 第二次握手:        服务器端收到客户

2017-07-10 19:31:21 191

原创 【Linux】UDP 服务器端与客户端通信

vim udp_server.cvim udp_client.c运行结果如下:udp 不可靠,那么如何在用户空间实现可靠性呢?       udp 不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用 UDP 较多,因为它们即使偶尔丢失

2017-07-10 17:32:39 1077

原创 【Linux】TCP 客户端与服务器端通信

第一种版本:vim tcp_server.cvim tcp_client.c运行结果如下:

2017-07-06 10:31:38 425

原创 【C++】构造拷贝构造的 N 中调用情况

1.先总结C++对传参合传返回值时构造的优化处理。 2.再完成下面的题目。 Test1中调用了___次AA的拷贝构造函数,___次AA的赋值运算符函数的重载。 Test2中调用了___次AA的拷贝构造函数,___次AA的赋值运算符函数的重载。 Test3中调用了___次AA的拷贝构造函数,___次AA的赋值运算符函数的重载。 class AA {}; A

2017-07-04 16:23:03 230

原创 【C】单链表面试题(进阶)

1. 判断单链表是否带环?若带环,求环的长度?求环的入口点?//判断是否带环ListNode* IsCycle(ListNode* list){ ListNode* fast = list, *slow = list; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; if (

2017-07-02 22:21:25 174

原创 【C++】动态内存管理

1. 总结并剖析 malloc/free 和 new/delete 之间关系和差异。 1)它们都是动态管理内存的入口。2)malloc/free 是 C/C++ 标准库的函数,new/delete 是 C++ 操作符。3)malloc/free 只是动态分配内存空间/释放空间。而 new/delete 除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理成员)。4)malloc/free 需要手动计算类型大小且返回值是 void*,new/delete 可自己计算类型的大小,返回对应类型的指

2017-07-02 21:32:57 162

原创 【C】单链表

头文件#define _CRT_SECURE_NO_WARNINGS#pragma once#include #include #include typedef int DataType;typedef struct SListNode{ DataType data; //链表中存放的数据 struct SListNode *pNex

2017-07-01 21:53:20 231

原创 【C】单链表面试题(基础篇)

1.比较顺序表和链表的优缺点,说说它们分别在什么场景下使用? 1)从结构上进行分析:(1)对于顺序表,不论是静态的还是动态的,他们都是连续的存储空间,在读取上时间效率比较快,可以通过地址之间的运算来进行访问,但是在插入和删除操作会出现比较麻烦的负载操作。(2)对于链表,因为是链式存储,在我们需要的时候才在堆上开辟空间,对于插入查找的方式比较便携。但是对于遍历的话需要多次的空间跳

2017-06-30 15:48:31 217

原创 【C++】类和对象--基础知识+四个默认成员函数+运算符重载

类和对象类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数。与结构体一样,类只是一种复杂数据类型的声明,不占用内存空间。而对象是类这种数据类型的一个变量,或者说是通过类这种数据类型创建出来的一份实实在在的数据,所以占用内存空间。 类的定义

2017-06-29 17:21:36 449

原创 【C++】C++ 基础知识

1. 命名空间       名字空间域是随标准 C++ 而引入的。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字 namespace 开头给它起一个名字:namespace name1{int a = 0;}namespace name2{int a = 1;}name1::a = 3;name2::a = 4;名字空间域解决了全

2017-06-29 16:00:30 1121

原创 【Linux】子进程的异步等待方式

子进程在终止时会给父进程发 SIGCHLD 信号,该信号的默认处理动作是忽略,父进程可以自定义 SIGCHLD 信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用 wait 清理子进程即可。一、子进程退出时给父进程发送信号二、父进程异步等待子进程

2017-06-29 11:50:49 258

原创 【Linux】实现睡眠函数mysleep

1. 普通版本的 mysleep 函数(有 bug 存在)代码如下:vim mysleep.cvim Makefile运行结果如下:我们可以发现当我们的代码运行以后,屏幕上输出很多的 using mysleep sleep! ,而且在最后一行每隔三秒打印一次,且一直打印直到我们强制停止。审视 “mysleep” 程序,设想这样的时序:

2017-06-29 10:34:20 512

原创 【Linux】调研 crond 和 crontab

一、概念1. 定义        crond 是 Linux 系统用来定期执行命令或指定程序的服务的一种服务或软件。一般情况下当我们安装完成 Linux 操作系统之后,默认便会启动 Crond 任务调用服务。Crond 服务会定期(默认一分钟检查一次)检查系统中是否有要执行的任务工作。如果有,便根据其预先设定的定时任务规则自动执行该定时任务工作。这个 Crond 定时服务就像闹钟。

2017-06-28 16:57:38 226

原创 【网络】CRC校验

CRC  即循环冗余校验码:是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似算法,以保证数据传输的正确性和完整性。 循环冗余校验原理:在数据链路层传送的帧中,广泛使用了循环冗余检验CRC 的检错技术。在发送端,先把数据划分为组(即:一帧)。

2017-06-28 15:22:33 363

原创 【Linux】守护进程

1. 守护进程的概念:守护进程(Daemon)是一种运行在后台的一种特殊的进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在Linux中,每个系统与用户进行交流的界面成为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且

2017-06-27 15:10:32 175

原创 【Linux】互斥锁

mutex (互斥量)多个线程同时访问共享数据时可能会冲突,比如 两个线程都要把某个全局变量增加 1,这个操作在某平台需要三条指令完成:1. 从内存读变量值到寄存器2. 寄存器的值加13. 将寄存器的值写回内存对于多线程的程序,访问冲突的问题是很普遍的,解决的办法是引入互斥锁(Mutex,Mutual Exclusive Lock),获得锁的线程可以完成“读-修改-写”的操作,

2017-05-30 20:54:19 222

原创 【Linux】线程属性控制

1.概念多线程的控制流程可以长期并存,操作系统会在各线程之间调度和切换,就像在多个进程之间调度和切换一样。由于同一进程的多个线程共享同一地址空间,因此 Text Segment、Data Segment 都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一 个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:(1)文件描述符表(2)每种信号的处理方式

2017-05-27 13:25:45 157

原创 【Linux】共享内存--实现进程间通信

使得多个进程可以访问同一块内存空间,是最快的可用 IPC 形式。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

2017-05-19 20:53:37 391

原创 【Linux】信号量--实现进程间通信

信号量的本质是一个计数器,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用。大于 0,资源可以请求;等于 0,无资源可用,进程会进入睡眠状态直至资源可用。当进程不再使用一个信号量控制的共享资源时,信

2017-05-19 20:36:59 473 1

原创 【Linux】消息队列--实现进程间通信

定义:消息队列提供了一种从一个进程向另一个进程发送一个有类型数据块的方法。

2017-05-15 19:51:36 278

原创 【Linux】Shell--支持重定向

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往 要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。其实有六种以exec开头的函数,统称exec函数:#include int execl

2017-05-15 19:45:16 155

原创 【Linux】管道容量及缓冲区的存储方式

1.管道容量管道容量分为 pipi capacity 和pipe_buf,这两者的区别在于 pipe_buf  定义的是内核管道缓冲区的大小,这个值的大小是由内核设定的,这个值仅需一条命令就可以查到,而 pipe capacity  指的是管道的最大值,即容量,是内核内存中的一个缓冲区。pipe_buf  命令:ulimit -a

2017-05-14 17:07:47 1805

原创 【C】模仿 qsort 的功能实现一个通用的冒泡排序

#define _CRT_SECURE_NO_WARNINGS 1 #include #include int cmp(const void*n1, const void*n2) //判断n1,n2元素大小,n1比n2大返回正数;小返回负数,相同返回0 { return *(char*)n1 - *(char*)n2; //升序 }void Swap

2017-05-13 20:41:53 616

原创 【C】理解指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针

理解指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针。1. 指针数组是数组,存放指针的数组。2. 数组指针是指针3.函数指针存放函数的地址4.函数指针数组5.指向函数指针数组的指针

2017-05-09 22:34:17 199

原创 【Linux】管道--实现进程间通信

管道是一种最基本的 IPC 机制,由 pipe 函数创建:#include int pipe(int filedes[2]);调用 pipe 函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过 filedes 参数传出给用户程序两个文件描述符,filedes[0] 指向管道的读端,filedes[1] 指向管道的写端。所以管道在用户程序看起来就像一个

2017-05-09 22:13:12 303

原创 【Linux】File 结构体,和 fd 的关系

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

2017-04-25 22:10:56 603

原创 【Linux】atexit 的验证

在我们进行进程终止的分析前,先引入一下关于 main 函数的知识:当内核使用一个 exec 函数执行 C 程序时,在调用 main 函数之前先调用一个特殊的启动例程,可执行程序将此例程指定为程序的起始地址。启动例程从内核获取命令行参数和环境变量,然后为调用 main 函数做好准备。引入 main 函数的知识是因为我们最常接触的就是 main 函数的返回,以 main 函数的返回 return 进行引入更能容易理解进程终止的概念。接下来我们介绍下进程终止吧。进程终止的方式有8种:1. 从 main

2017-04-24 19:20:04 188

原创 【C】函数的调用过程,栈帧的创建和销毁

每一次函数调用都是一个过程,这个过程我们称之为:函数的调用过程。函数调用过程要为函数开辟栈空间,用于本次函数的调用中临时变量的保存、现场保护。这块栈空间我们称之为函数栈帧。栈帧的维护需要我们了解ebp和esp两个寄存器,在函数调用的过程中这两个寄存器存放了维护这个栈的栈底和栈顶指针。ebp 存放了指向函数栈帧栈底的地址;esp 存放了指向函数栈帧栈顶的地址。

2017-04-23 16:33:43 346

原创 【C】可变参数列表剖析

C 语言中可通过将函数实现为可变参数的形式,可以使得函数可以接受1个以上的任意多个参数(不固定)。

2017-04-21 16:22:46 294

原创 【C】unsigned int reverse_bit(unsigned int value); 这个函数的返回值value的二进制位模式从左到右翻转后的值

编写函数:unsigned int  reverse_bit(unsigned int value);这个函数的返回值value的二进制位模式从左到右翻转后的值。如:在32位机器上25这个值包含下列各位:00000000000000000000000000011001翻转后:(2550136832)  10011000000000000000000000000000程序结果

2017-04-14 17:08:26 338

原创 【C】将字符数组的内容:"student a am i"改为"i am a student".

1.有一个字符数组的内容为:"studenta am i",请你将数组的内容改为"i am a student".要求:不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。程序1:#define _CRT_SECURE_NO_WARNINGS 1 #include #include #include void reverse(char *start,

2017-04-14 17:04:18 375

原创 【Linux】僵尸进程和孤儿进程

在我们进行关于僵尸进程和孤儿进程的分析前,先了解下进程都有哪些状态:下面的状态在 fs/proc/array.c 文件里定义:/** The task state array is a strange "bitmap" of* reasons to sleep. Thus "running" is zero, and* you can test for combinations of

2017-04-14 13:03:52 357

原创 【Linux】使用vim编写一个程序,gcc查看预处理、编译、汇编、链接过程

1.      在linux环境实践,使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容,并熟悉相关指令。预处理:gcc  -E  test.c  -o  test.i编译:   gcc  -S  test.i   -o  test.s汇编:   gcc  -c  test.s  -o  test.o链接:   gcc

2017-04-12 21:50:21 1892 1

空空如也

空空如也

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

TA关注的人

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