- 博客(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
306
原创 【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
478
原创 【Linux】shell 语法
1. 条件测试:test 和 [ 命令 test 或 [ 可以测试一个条件是否成立,如果测试结果为真,则该命令的退出码为 0,如果测 试结果为假,则命令的退出码为 1 (与C语言的逻辑表示正好相反)。 当我们在进行比较时,不能使用 C 语言风格的 ==、!= ,而要使用 -eq(等于)、-ne(不等于)、-gt(大于)、-ge(大于等于)、-lt(小于)、-le(小于等于)。 $? 表示上一条命令的退出码,echo $? 查看命令结果成功与否。0 真,非 0 假。
2017-07-14 17:22:43
342
原创 【Linux】进度条
1. 基本语法2. 进度条实现普通进度条:实现彩色进度条:这里的 m 值即 color 采用了取模运算, 是为了让进度条八种颜色不断变换达到彩色效果。进度条颜色设置:shell 脚本中 echo 显示内容带颜色显示,echo 显示带颜色,需要使用参数 -e ,-n
2017-07-14 10:37:52
381
原创 【网络】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
474
原创 【Linux】命令代换
1. `` 和 $() 由反引号 `` 括起来的也是一条命令,Shell 先执行该命令,然后将输出结果立刻代换到当前命令行中。例如定义一个变量存放 date 命令的输出:命令代换用 `` 表示:DATE=`date`命令代换也可以用 $() 表示:DATE=$(date)
2017-07-12 22:54:18
267
原创 【Linux】TCP 三次握手与四次挥手
1. TCP 连接建立与释放2. 为什么要三次握手?第一次握手: 客户端先发送一个 SYN 请求(SYN=1 表示该报文是一个连接请求报文),发送的序号 seq=x(x 是系统自己选定的大小),SYN 虽然不携带数据但是会消耗一个序列号。当客户端的 SYN 请求发送出去之后,客户端进入 SYN-SENT 状态。 第二次握手: 服务器端收到客户
2017-07-10 19:31:21
230
原创 【Linux】UDP 服务器端与客户端通信
vim udp_server.cvim udp_client.c运行结果如下:udp 不可靠,那么如何在用户空间实现可靠性呢? udp 不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用 UDP 较多,因为它们即使偶尔丢失
2017-07-10 17:32:39
1126
原创 【C++】构造拷贝构造的 N 中调用情况
1.先总结C++对传参合传返回值时构造的优化处理。 2.再完成下面的题目。 Test1中调用了___次AA的拷贝构造函数,___次AA的赋值运算符函数的重载。 Test2中调用了___次AA的拷贝构造函数,___次AA的赋值运算符函数的重载。 Test3中调用了___次AA的拷贝构造函数,___次AA的赋值运算符函数的重载。 class AA {}; A
2017-07-04 16:23:03
260
原创 【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
205
原创 【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
203
原创 【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
262
原创 【C】单链表面试题(基础篇)
1.比较顺序表和链表的优缺点,说说它们分别在什么场景下使用? 1)从结构上进行分析:(1)对于顺序表,不论是静态的还是动态的,他们都是连续的存储空间,在读取上时间效率比较快,可以通过地址之间的运算来进行访问,但是在插入和删除操作会出现比较麻烦的负载操作。(2)对于链表,因为是链式存储,在我们需要的时候才在堆上开辟空间,对于插入查找的方式比较便携。但是对于遍历的话需要多次的空间跳
2017-06-30 15:48:31
272
原创 【C++】类和对象--基础知识+四个默认成员函数+运算符重载
类和对象类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数。与结构体一样,类只是一种复杂数据类型的声明,不占用内存空间。而对象是类这种数据类型的一个变量,或者说是通过类这种数据类型创建出来的一份实实在在的数据,所以占用内存空间。 类的定义
2017-06-29 17:21:36
494
原创 【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
1174
原创 【Linux】子进程的异步等待方式
子进程在终止时会给父进程发 SIGCHLD 信号,该信号的默认处理动作是忽略,父进程可以自定义 SIGCHLD 信号的处理函数,这样父进程只需专心处理自己的工作,不必关心子进程了,子进程终止时会通知父进程,父进程在信号处理函数中调用 wait 清理子进程即可。一、子进程退出时给父进程发送信号二、父进程异步等待子进程
2017-06-29 11:50:49
301
原创 【Linux】实现睡眠函数mysleep
1. 普通版本的 mysleep 函数(有 bug 存在)代码如下:vim mysleep.cvim Makefile运行结果如下:我们可以发现当我们的代码运行以后,屏幕上输出很多的 using mysleep sleep! ,而且在最后一行每隔三秒打印一次,且一直打印直到我们强制停止。审视 “mysleep” 程序,设想这样的时序:
2017-06-29 10:34:20
589
原创 【Linux】调研 crond 和 crontab
一、概念1. 定义 crond 是 Linux 系统用来定期执行命令或指定程序的服务的一种服务或软件。一般情况下当我们安装完成 Linux 操作系统之后,默认便会启动 Crond 任务调用服务。Crond 服务会定期(默认一分钟检查一次)检查系统中是否有要执行的任务工作。如果有,便根据其预先设定的定时任务规则自动执行该定时任务工作。这个 Crond 定时服务就像闹钟。
2017-06-28 16:57:38
282
原创 【网络】CRC校验
CRC 即循环冗余校验码:是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似算法,以保证数据传输的正确性和完整性。 循环冗余校验原理:在数据链路层传送的帧中,广泛使用了循环冗余检验CRC 的检错技术。在发送端,先把数据划分为组(即:一帧)。
2017-06-28 15:22:33
402
原创 【Linux】守护进程
1. 守护进程的概念:守护进程(Daemon)是一种运行在后台的一种特殊的进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。由于在Linux中,每个系统与用户进行交流的界面成为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且
2017-06-27 15:10:32
200
原创 【Linux】互斥锁
mutex (互斥量)多个线程同时访问共享数据时可能会冲突,比如 两个线程都要把某个全局变量增加 1,这个操作在某平台需要三条指令完成:1. 从内存读变量值到寄存器2. 寄存器的值加13. 将寄存器的值写回内存对于多线程的程序,访问冲突的问题是很普遍的,解决的办法是引入互斥锁(Mutex,Mutual Exclusive Lock),获得锁的线程可以完成“读-修改-写”的操作,
2017-05-30 20:54:19
275
原创 【Linux】线程属性控制
1.概念多线程的控制流程可以长期并存,操作系统会在各线程之间调度和切换,就像在多个进程之间调度和切换一样。由于同一进程的多个线程共享同一地址空间,因此 Text Segment、Data Segment 都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一 个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:(1)文件描述符表(2)每种信号的处理方式
2017-05-27 13:25:45
188
原创 【Linux】共享内存--实现进程间通信
使得多个进程可以访问同一块内存空间,是最快的可用 IPC 形式。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
2017-05-19 20:53:37
447
原创 【Linux】信号量--实现进程间通信
信号量的本质是一个计数器,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用。大于 0,资源可以请求;等于 0,无资源可用,进程会进入睡眠状态直至资源可用。当进程不再使用一个信号量控制的共享资源时,信
2017-05-19 20:36:59
580
1
原创 【Linux】Shell--支持重定向
用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往 要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。其实有六种以exec开头的函数,统称exec函数:#include int execl
2017-05-15 19:45:16
187
原创 【Linux】管道容量及缓冲区的存储方式
1.管道容量管道容量分为 pipi capacity 和pipe_buf,这两者的区别在于 pipe_buf 定义的是内核管道缓冲区的大小,这个值的大小是由内核设定的,这个值仅需一条命令就可以查到,而 pipe capacity 指的是管道的最大值,即容量,是内核内存中的一个缓冲区。pipe_buf 命令:ulimit -a
2017-05-14 17:07:47
1899
原创 【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
664
原创 【C】理解指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针
理解指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针。1. 指针数组是数组,存放指针的数组。2. 数组指针是指针3.函数指针存放函数的地址4.函数指针数组5.指向函数指针数组的指针
2017-05-09 22:34:17
224
原创 【Linux】管道--实现进程间通信
管道是一种最基本的 IPC 机制,由 pipe 函数创建:#include int pipe(int filedes[2]);调用 pipe 函数时在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端一个写端,然后通过 filedes 参数传出给用户程序两个文件描述符,filedes[0] 指向管道的读端,filedes[1] 指向管道的写端。所以管道在用户程序看起来就像一个
2017-05-09 22:13:12
349
原创 【Linux】File 结构体,和 fd 的关系
File 结构体1.1 struct file struct file 结构体定义在 include/linux/fs.h 中定义。文件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的 struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。在内核创建和驱动源码中,str
2017-04-25 22:10:56
681
原创 【Linux】atexit 的验证
在我们进行进程终止的分析前,先引入一下关于 main 函数的知识:当内核使用一个 exec 函数执行 C 程序时,在调用 main 函数之前先调用一个特殊的启动例程,可执行程序将此例程指定为程序的起始地址。启动例程从内核获取命令行参数和环境变量,然后为调用 main 函数做好准备。引入 main 函数的知识是因为我们最常接触的就是 main 函数的返回,以 main 函数的返回 return 进行引入更能容易理解进程终止的概念。接下来我们介绍下进程终止吧。进程终止的方式有8种:1. 从 main
2017-04-24 19:20:04
223
原创 【C】函数的调用过程,栈帧的创建和销毁
每一次函数调用都是一个过程,这个过程我们称之为:函数的调用过程。函数调用过程要为函数开辟栈空间,用于本次函数的调用中临时变量的保存、现场保护。这块栈空间我们称之为函数栈帧。栈帧的维护需要我们了解ebp和esp两个寄存器,在函数调用的过程中这两个寄存器存放了维护这个栈的栈底和栈顶指针。ebp 存放了指向函数栈帧栈底的地址;esp 存放了指向函数栈帧栈顶的地址。
2017-04-23 16:33:43
380
原创 【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
364
原创 【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
401
原创 【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
395
原创 【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
2021
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人