自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

编程小镇

如人饮水,冷暖自知。

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

原创 网络编程系列(一)字节序

网络编程系列之字节序字节序字节序转换函数字节序  字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。字节序分为大端字节序(Big-Endian) 和小端字节序(Little-Endian)。大端字节序是指一个整数的最高位字节(23 ~ 31 bit)存储在内存的低地址处,低位字节(0 ~ 7 bit)存储在内存的高地址处;小端字节序则是指整数的高位字节存储在内存的高地址处,而低位字节则存储在内存的低地址处。/* 字节序:字节

2021-02-28 14:02:28 312

原创 线程同步(互斥量、死锁、读写锁、生产者与消费者模型实现)

线程同步(互斥量、死锁、读写锁、生产者与消费者模型实现)线程同步互斥量 mutexmutex 相关系统调用死锁读写锁条件变量实现生产者与消费者模型信号量实现生产者与消费者模型线程同步  在多线程进行  线程的主要优势在于,能够通过全局变量来共享信息。不过,这种便捷的共享是有代价的:必须确保多个线程不会同时修改同一变量,或者某一线程不会读取正在由其他线程修改的变量。  临界区是指访问某一共享资源的代码片段,并且这段代码的执行应为原子操作,也就是同时访问同一共享资源的其他线程不应终端该片段的执行。  

2021-02-04 10:38:36 437 1

原创 线程相关系统调用(pthread使用)

线程相关系统调用(pthread使用)创建线程(pthread_create())终止线程(pthread_exit())连接已终止线程(pthread_join())线程分离(pthread_detach())线程取消(pthread_cancel())线程属性创建线程(pthread_create())函数原型#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

2021-02-02 14:17:38 1323

原创 线程基本概念

线程基本概念  与进程(process)类似,线程(thread)是允许应用程序 并发执行多个任务的一种机制。一个进程可以包含多个线程。同一个程序中的所有线程均会独立执行相同程序,且 共享同一份全局内存区域,其中包括初始化数据段、未初始化数据段,以及堆内存段。(传统意义上的 UNIX 进程只是多线程程序的一个特例,该进程只包含一个线程)  进程是 CPU 分配资源的最小单位,线程是操作系统调度执行的最小单位。线程是轻量级的进程(LWP:Light Weight Process),在 Linux 环境下线

2021-02-02 08:44:52 181

原创 守护进程

守护进程终端进程组会话守护进程创建守护进程终端  在 UNIX 系统中,用户通过终端登录系统后得到一个 shell 进程,这个终端成为 shell 进程的控制终端(Controlling Terminal),进程中,控制终端是保存在 PCB 中的信息,而 fork() 会复制 PCB 中的信息,因此由 shell 进程启动的其它进程的控制终端也是这个终端。  默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是读用户的键盘输入,进程往标准输出或标准

2021-01-29 21:27:23 159

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

进程间通信(五)共享内存共享内存的使用步骤相关系统调用小结  共享内存允许两个或者多个进程共享物理内存的同一块区域(通常被称为段)。由于一个共享内存段会成为一个进程用户空间的一部分,因此这种 IPC 机制无需内核介入。所有需要做的就是让一个进程将数据复制进共享内存中,并且这部分数据会对其他所有共享同一个段的进程可用。  与管道等要求发送进程将数据从用户空间的缓冲区复制进内核内存和接收进程将数据从内核内存复制进用户空间的缓冲区的做法相比,这种 IPC 技术的速度更快。共享内存的使用步骤调用 sh

2021-01-29 17:07:50 901

原创 进程间通信(四)信号

进程间通信(四)信号信号的基本概念产生信号的事件信号的目的与特点各种信号信号的状态及默认处理动作信号相关函数kill(), raise(), abort()alarm() 定时器setitimer() 定时器信号捕捉函数(signal(), sigaction())SIGCHLD 信号信号集未决信号集与阻塞信号集自定义信号集相关函数系统信号集操作函数信号的基本概念  信号是 Linux 进程间通信的最古老的方式之一,是事件发生时对进程的通知机制,有时也称之为软件中断,它是在软件层次上对中断机制的一种模拟

2021-01-26 18:59:57 297

原创 进程间通信(三)内存映射

进程间通信(三)内存映射mmap()系统调用  内存映射(Memory-mapped I/O) 是将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。下面介绍内存映射相关的系统调用。 mmap()系统调用函数原型#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);int munmap(void

2021-01-25 14:07:54 450

原创 剑指offer系列(61)序列化二叉树

解题思路序列化:利用先序遍历节点,节点为空时,保存#,节点与节点之间用空格隔开。反序列化:将字符串还原成节点保存至队列中,依次取出节点即可。class Solution {public: char* Serialize(TreeNode *root) { if (root == nullptr) return nullptr; string res = serialize(root); char* buffer = new char[res.size() + 1.

2021-01-25 09:23:50 133

原创 剑指offer系列(60)把二叉树打印成多行

解题思路:层次遍历class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int>> res; queue<TreeNode*> que; if (pRoot == nullptr) return res; .

2021-01-19 14:37:34 114

原创 剑指offer系列(59)按之字形顺序打印二叉树

解题思路:层序遍历时,判断当前层数,若为奇数层,则反转当前层的结果,再保存。class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int>> res; queue<TreeNode*> que; if (pRoot == nullptr) return res; int level_num = 0;.

2021-01-19 12:24:10 145

原创 剑指offer系列(22)从上到下打印二叉树

剑指offer系列(22)从上到下打印二叉树解题思路:依次将每一层节点存放至队列中,队列中的节点个数为该层节点数,依次弹出。在弹出时将其孩子节点依次放至队列,逐层遍历。 class Solution {public: vector<int> PrintFromTopToBottom(TreeNode* root) { vector<int> res; queue<TreeNode*> que; if (root == nullptr) ret

2021-01-19 12:02:32 123

原创 利用命名管道实现简单聊天功能

利用命名管道实现简单聊天功能进程A:以只写方式打开FIFO1以只读方式打开FIFO2循环读写数据进程B:以只读方式打开FIFO1以只写方式打开FIFO2循环读写数据chata.c如下#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <stdlib.h>#include <fcnt

2021-01-17 16:33:30 540

原创 进程间通信(二)有名管道

进程间通信(二)有名管道有名管道 / 命名管道创建命名管道的两种方式命令创建(mkfifo)系统调用创建(mkfifo())使用有名管道在两个进程之间进行通信有名管道 / 命名管道  匿名管道,由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道(FIFO),也叫命名管道、 FIFO文件。  有名管道(FIFO)不同于匿名管道之处在于它提供了一个路径名与之关联,以 FIFO的文件形式存在于文件系统中,并且其打开方式与打开一个普通文件是一样的,这样即使与 FIFO 创建进程不

2021-01-16 19:44:21 279

原创 进程间通信(一)匿名管道通信

进程间通信(一)管道通信管道介绍及特点匿名管道使用(pipe系统调用)管道缓冲区大小(ulimit -a)匿名管道通信实例 —— 实现 |小结巨人的肩膀  管道介绍及特点  管道也叫无名(匿名)管道,它是是 UNIX 系统 IPC(进程间通信)的最古老形式,所有的 UNIX 系统都支持这种通信机制。  举个例子,统计一个目录中文件的数目命令:ls | wc –l,为了执行该命令, shell 创建了两个进程来分别执行 ls 和 wc。中间的 | 为管道符,ls 进程将得到的结果(默认输出至终端)交

2021-01-15 17:05:48 287

原创 进程间通信

操作系统面试送分题(五)进程间通信灵魂拷问:进程间通信方式有哪几种?每一种方式的实现原理?

2021-01-15 16:57:30 223

原创 C++进阶(四)const、volatile、mutable关键字

C++进阶(四)const、volatile、mutable关键字const 关键字用法用法一:const在类中的使用用法二:常量引用用法三:常量指针volatilemutable巨人的肩膀  const 关键字用法  C语言中,可以使用#define 定义常量,编译器在预处理阶段直接将宏替换,在C++中,使用const 关键字来定义常量,如常量字符串等。常量存放在常量区(常量区只读不可写)。const 常量在运行时被操作系统载入常量区,属于运行时常量。  C++ 中 const 有以下几种用法:c

2021-01-08 13:21:19 268

原创 Linux 进程回收的系统调用(wait、waitpid)

Linux 进程回收的系统调用(wait、waitpid)wait 系统调用waitpid 系统调用  在每个进程退出的时候,内核释放该进程所有的资源、包括打开的文件、占用的内存等。但是仍然为其保留一定的信息,这些信息主要主要指进程控制块PCB的信息(包括进程号、退出状态、运行时间等)。  父进程可以通过调用 wait 或 waitpid 得到它的退出状态同时彻底清除掉这个进程。注意:一次wait或waitpid调用只能清理一个子进程,清理多个子进程应使用循环。 wait 系统调用函数接口

2021-01-06 20:27:23 407

原创 操作系统面试送分题(四)孤儿进程、僵尸进程

操作系统面试送分题(四)孤儿进程、僵尸进程 孤儿进程  父进程运行结束,但子进程还在运行(未运行结束),这样的子进程就称为孤儿进程(Orphan Process)。  每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为 init,而 init进程会循环地 wait() 它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候, init 进程就会代表党和政府出面处理它的一切善后工作。  因此孤儿进程并不会有什么危害。init 进程是pid为1的Linux初始化进程。示

2021-01-06 18:10:16 217

原创 C++进阶(三)static 关键字

C++进阶(三)static 关键字在作用域上,限定其作用范围在内存方面,存储在静态存储区类中的静态成员函数和成员变量在作用域上,限定其作用范围  对于全局变量和函数来说,使用 static 修饰,使得其仅在当前文件中可见,在其他的文件中不可见。// static.cstatic int g_c_staVal;int g_c_Val;// use_static.c#include <iostream>using namespace std;extern int g_c_

2021-01-05 21:26:28 148

原创 进程退出的两个接口( exit()、_exit() )

进程终止  进程在被创建后,开始运行完成其工作。通常在下列几个条件使得进程退出:正常退出出错退出严重错误:程序中有bug被其他进程杀死进程退出的两个接口(exit 、 _exit)#include <stdlib.h>void exit(int status);#include <unistd.h>void _exit(int status);参数:status :进程退出时的一个状态信息。父进程在回收子进程资源时获取。示例1:exit#inc

2021-01-05 13:10:04 428

原创 C++进阶(二)四种类型转换(static_cast, const_cast, dynamic_cast, reinterpret_cast)

C++进阶(二)四种类型转换(static_cast, const_cast, dynamic_cast, reinterpret_cast)static_cast 类型转换const_cast 类型转换reinterpret_cast 类型转换dynamic_cast 类型转换巨人的肩膀   在 C 语言中,如果要对类型进行转换,直接使用强制类型转换。这种转换使得表达式的精度有所损失,会出现一些未定义错误。这种强制转换方式有如下缺点:任何类型都能进行强制转换,编译器很难判断其正确性在源码中,无法定

2021-01-04 19:10:00 329

原创 Linux系统编程(十)exec 族函数

Linux系统编程(十)exec 族函数execl() 函数execlp() 函数  exec 函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。  exec 函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代,只留下进程 ID 等一些表面上的信息仍保持原样,颇有些神似“三十六计”中的“金蝉脱壳”。看上去还是旧的躯壳,却已经注入了新的灵魂。只有调用失败了,它们才会返回 -1,从原程

2021-01-03 20:09:56 312

原创 Markdown 进阶使用:表情、图标

Markdown 进阶使用:表情、图标今天用整理了下 github ,发现使用 表情的效果很棒,记录一下。Markdown表情Markdown 图标使用

2021-01-03 18:50:18 6037 1

原创 Linux进程创建之浅析fork()

  在Linux 内核中,无时无刻不维护着进程,从进程的创建到进程销毁,每一个环境都有着复杂的细节。本篇介绍Linux 内核如何创建进程,深入理解 fork 函数以及子进程的创建,对理解多进程开发也至关重要。Linux进程创建之fork浅析fork() 函数fork() 示例父子进程的虚拟地址空间fork() 函数  首先来看下fork() 函数,其作用是创建子进程。头文件与函数原型如下#include <unistd.h>// 参数 : void // 返回值: pid_t 创建

2020-12-31 13:28:59 276

原创 Linux进程常用命令及使用

Linux进程相关命令topps

2020-12-30 19:40:49 193

原创 操作系统面试送分题(三):进程状态

操作系统基础知识:进程状态&emssp;

2020-12-30 18:50:23 702 1

原创 操作系统面试送分题(二)什么是并行?什么是并发?

灵魂拷问:什么是并行?什么是并发?  并行:指同一时刻,多条指令在多个处理器上同时执行。并发:在同一时刻,仅有一条指令执行,但多个进程快速切换,使得宏观来看有多个进程在执行,但实际并不是同时执行的,而是快速交替的执行。对于服务端来说,并发编程至关重要。在服务请求巨大时,如双十一,同一时刻会有巨大流量访问服务器,如何使得服务器不崩溃,如何使得服务器稳定运行,并发就尤为关键。  并发是在有限资源上,尽可能使得效率提高,在程序并发执行时,需要注意对资源的访问控制。而不同进程并行执.

2020-12-29 19:33:27 403

原创 操作系统面试送分题(一)什么是程序?什么是进程?他们之间的区别是什么?

操作系统基础知识:什么是程序?什么是进程?他们之间的区别是什么?点击链接直达 操作系统面试汇总本篇文章详细讲解以下问题:什么是程序?什么是进程?他们之间的区别是什么?灵魂拷问:程序与进程的区别?  程序是包含一系列信息的文件,描述如何在运行时创建一个进程,如我们写的源代码文件,编译好的可执行文件 .out 文件等。所以在操作系统角度,程序是创建进程的描述。程序文件可以包含以下描述信息:二进制格式标识 :每个程序都有用于描述可执行文件格式的信息。Linux 内核通过该信息来处理和解释文件中的

2020-12-29 18:27:39 475

原创 Linux 命令速查手册(五)Linux用户权限管理必知必会

Linux 命令速查手册(五)Linux用户权限管理必知必会5.1 useradd:添加用户5.2 passwd:为用户设置密码5.3 userdel:删除用户5.4 su:切换用户5.5 group:用户组5.6 chmod:用户权限5.8 chown:修改文件或目录持有者5.9 bashrc / profile:环境变量bashrc / profile文件`~/.bashrc` 与`~/.profile`对比5.1 useradd:添加用户useradd -m username:创建 userna

2020-12-28 20:14:11 584

原创 Linux 命令速查手册(四)使用Linux必须要会的压缩/解压缩命令

Linux 命令速查手册(四)使用Linux必须要会的压缩/解压缩命令4.1 df:查看磁盘大小4.2 tar:打包/压缩4.3 tar:解包/解压缩4.1 df:查看磁盘大小df -h:查看磁盘空间利用大小df -sh:查看当前目录所占空间大小root@Eternal:~# df -hFilesystem Size Used Avail Use% Mounted onudev 225M 0 225M 0% /devtmpfs

2020-12-28 20:09:52 151

原创 Linux 命令速查手册(三)Linux文本处理

Linux 命令速查手册(三)Linux文本处理3.1 find:文件查找3.2 grep:文本搜索3.3 xargs:命令行参数转换3.4 sort:排序3.5 uniq:消除重复行3.6 cut:按列切分字符3.7 paste:按列拼接文本3.8 wc:统计行和字符数3.9 sed:文本替换3.10 awk:数据流处理3.1 find:文件查找find . -name “file_name” -maxdepth n:在当前目录下搜索n层,查找 file_name 文件root@Eternal:

2020-12-28 20:06:28 131

原创 Linux 命令速查手册(二)Linux文件管理及目录管理快速学习

Linux 命令速查手册(二)Linux文件管理及目录管理快速学习2.1 mkdir:创建目录2.2 rm:删除文件/ 目录2.3 mv:移动文件/目录2.4 cd:切换目录2.5 ls:列出目录项2.6 find / locate:查找文件或目录2.7 cat:查看文件2.8 egrep:查找文件2.9 chown/chmod:更改文件/目录的用户权限与使用权限2.10 ln:给文件增加别名2.11 > / >>:管道和重定向2.12 Bash 快捷键参考2.1 mkdir:创建目录

2020-12-28 20:00:33 140

原创 Linux 命令速查手册(一)学习Linux必须要会的帮助命令

Linux 命令速查手册(一)帮助命令1.1 whatis:简述命令的作用1.2 info:查看命令详细的说明文档1.3 man:查看命令的说明文档1.4 which:查看可执行文件的路径1.5 whereis:查看程序的搜索路径1.1 whatis:简述命令的作用whatis: 简述命令的作用root@Eternal:~# whatis whatiswhatis (1) - display one-line manual page descriptions1.2 info:

2020-12-28 19:56:04 200

原创 剑指offer系列分类汇总(更新ing)

剑指offer系列分类汇总链表动态规划链表JZ-06-从头到尾打印链表JZ-18-删除链表节点JZ-22-链表中倒数第K个节点JZ-23-链表中环的入口节点JZ-24-反转链表JZ-25-合并两个有序链表JZ-52-两个链表的第一个公共节点动态规划JZ-07-斐波那契数列JZ-08-跳台阶JZ-30-连续子数组的最大和JZ-33-丑数JZ-67-剪绳子...

2020-12-28 08:18:11 376

原创 动态规划 之 机器人到达指定位置的方法数

动态题目描述  假设有排成一行的N个位置,记为1~N,开始时机器人在M位置,机器人可以往左或者往右走,如果机器人在1位置,那么下一步机器人只能走到2位置,如果机器人在N位置,那么下一步机器人只能走到N-1位置。规定机器人只能走k步,最终能来到P位置的方法有多少种。由于方案数可能比较大,所以答案需要对1e9+7取模。输入描述:输入包括一行四个正整数N(2<=N<=5000)、M(1<=M<=N)、K(1<=K<=5000)、P(1<=P<=N)。

2020-12-28 08:09:28 979

原创 剑指offer系列(67)剪绳子

解题思路:动态规划。class Solution {public: int cutRope(int number) { if (number <= 4) return number; vector<int> f(number+1, 0); for (int i = 0; i <=4; i++){ f[i] = i; } for (int i = 5; i <= number; i++){ for (int j = 1; j &l.

2020-12-28 08:08:31 143

原创 剑指offer系列(33)丑数

  解题思路:动态规划。使用 i, j, k 三个指针,分别记录当前数*2,*3,*5的值,初始时指向第一个丑数,依次将array[0] * 2, array[j]*3,array[k]*5 ,取最小值,则为下一个丑数,然后比较是i, j, k哪个数的倍数,则将索引后移即可。class Solution {public: int GetUglyNumber_Solution(int index) { if (index <= 1) return index; vector&l.

2020-12-28 08:06:43 163

原创 剑指offer系列(8)跳台阶

剑指offer系列(8)跳台阶解题思路:动态规划。与斐波那契数列求解相同。class Solution {public: int jumpFloor(int number) { if (number <= 2) return number; int x = 1; int y = 2; for (int i = 3; i <= number; i++){ int cur = x + y; x = y; y = cur; } return

2020-12-27 20:09:17 124

原创 剑指offer系列(7)斐波那契数列

剑指offer系列(7)斐波那契数列大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n≤39示例1输入4返回值3解题思路:  ...

2020-12-27 20:02:35 113

空空如也

空空如也

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

TA关注的人

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