
Linux
Joker Zxc
这个世界是属于偏执狂的。
展开
-
面试题:设计循环队列
原题链接:https://leetcode-cn.com/problems/design-circular-queue/代码如下://设计循环队列class MyCircularQueue {public: int *array; int capacity; int size; int front; // 队首下标 int rear; // 队尾下标 /*在这里初始化...原创 2019-04-26 12:24:09 · 467 阅读 · 0 评论 -
Linux网络编程(1)——网络基础
网络:跨主机的 “进程间” 通信。协议:一种彼此双方都认可的协议。为什么分层?网络协议非常复杂,不分层就太复杂了。好处:拆分成多个层,就是类似分成多个模块,同时降低了系统的耦合程度。根据需要,可以随意替换其中的某一层协议网络的协议分层:OSI七层模型<只存在教科书中>:应用层 表示层 会话层 传输层 网络层 数据链路层 物理层...原创 2019-06-07 19:55:24 · 384 阅读 · 0 评论 -
线程面试常见的小问题
原创 2019-06-07 12:22:00 · 159 阅读 · 0 评论 -
Linux系统编程(22)——C++中自带的std::thread
C++中自带的std::threadc11 把线程纳入标准库中主要是:std::thread 类#include <stdlib.h>#include <stdio.h>//c++中自带的std::thread//c11 把线程纳入标准库中//std::thread 类void Handler(int num) { while (1) { ...原创 2019-06-07 11:38:08 · 2226 阅读 · 0 评论 -
Linux系统编程(21)——读者写者模型
一个交易场所:有一块儿存储区域保存数据两种角色:读者;写者三种关系:读者与读者之间——没有关系写者和写者之间——互斥读者和写者直接——同步互斥(同步的含义指的是:写者优先)读者写者模型最大的意义是:读者之间没有互斥,大大提高效率。——适用于“一写多读”的情况代码示例:代码示例:#include <stdio.h>#include<pthr...原创 2019-06-07 11:00:06 · 238 阅读 · 0 评论 -
Linux系统编程(19)——同步
同步同步控制着线程和线程之间的执行顺序。(主要是抢占式执行惹的祸,有的时候需要线程和线程之间按照一定的顺序来执行)。相关函数:位置在主函数中:pthread_cond_init(&cond,NULL):初始化同步pthread_cond_destory(&mutex):释放同步定义全局函数位置定义:pthread_cond_t cond:定义一个...原创 2019-06-04 18:04:05 · 166 阅读 · 0 评论 -
可重入函数和线程安全函数的区别
可重入函数:一个函数可以在任意执行流中调用,都不会出问题。线程安全函数:一个函数在任意线程中调用,都不会有问题。区别:可重入包含更高,覆盖了线程安全。如果一个函数是可重入函数,一定是线程安全的;一个函数线程安全,不一定可重入函数。代码示例:#include <stdio.h>#include<pthread.h> //头文件#include...原创 2019-05-31 21:00:02 · 473 阅读 · 0 评论 -
Linux系统编程(18)——互斥-互斥锁、死锁
互斥机制的原因:线程的抢占式执行,引起线程安全问题(多线程环境下程序的执行结果出现预期结果之外的值)。主要在公共资源的使用上才会显示最大问题。多个线程访问的那个公共资源叫做——临界资源访问临界资源的代码叫做——临界区在临界区使用 互斥机制 就能解决线程不安全问题。互斥机制的使用:使用互斥锁(互斥锁就像ATM取钱)先加锁 执行临界区代码 释放锁同一时刻只有一个线程才...原创 2019-05-31 20:55:02 · 780 阅读 · 0 评论 -
Linux系统编程(16)——线程控制相关函数-创建进程、查看线程信息
线程控制相关函数:#include<pthread.h> 头文件不是系统调用,posix线程库。创建进程 终止进程 等待进程 线程分离1.创建进程函数:pthread_create(pthread_t *thread, const pthread_attr_t *att, void *(*strart_routine)(void*), void *a...原创 2019-05-28 15:18:40 · 395 阅读 · 0 评论 -
Linux系统编程(14)——进程信号(全知识)-捕捉信号/流程、阻塞信号、volatile、可重入函数
信号:类似生活中,看到红绿灯就知道走还是不走信号具有的特点:信号有很多种 不同的信号有不同的处理方式 在信号发生之前,每种信号如何处理,我们都知道killkill -l(小写L):查看Linux所有的信号一共 62 种信号。1-31;34-64;函数:int kill(pid_t pid, int sig); 参数:pid_t pid:进程的id, ...原创 2019-05-24 21:29:59 · 317 阅读 · 0 评论 -
Linux网络编程(3)——套接字编程(1)TCP协议实现
源IP地址—目的地址:来自哪,到哪去端口号:发往那个端口的数据应该由哪个进程来处理一个端口只能被一个进程占用;一个进程可以多个端口占用。每条数据有源端口号,目的端口号。传输层协议选择:有连接 VS 无连接:有连接:双方必须都同意,才可以进行数据传输(打电话,必须等对方接通才能通话)无连接:双方不一定都同意,也可以进行数据传输(发QQ,无论在不在线,你条件允许都能发...原创 2019-06-28 15:37:15 · 318 阅读 · 0 评论 -
Linux系统编程(20)——生产者-消费者模型基础示例(栈、队列实现、实现线程池)
生产者-消费者模型多线程场景的的典型应用,应用场景非常广泛!手撕!!!消费者和消费者之间,是一个互斥关系。 生产者和生产者之间,是一个互斥关系。 生产者和消费者之间,是一个互斥同步关系。注:同步互斥不一定非要用互斥锁和条件变量,还可以用信号量。代码示例1:(栈实现,互斥锁/条件变量实现互斥同步)#include <stdio.h>#include&l...原创 2019-06-04 20:28:32 · 463 阅读 · 0 评论 -
Linux网络编程(8)——网络基础——网络层
IP协议IP划分的方案:CIDR划分方案:私有IP和公有IP:10.*,前8位是网络号,共16,777,216个地址 172.16.到172.31.,前12位是网络号,共1,048,576个地址 192.168.*,前16位是网络号,共65,536个地址包含在这个范围中的都成为私有IP,其余的则称为全局IP(或公网IP);路由在复杂的网络结构中,找出一...原创 2019-07-15 09:43:04 · 124 阅读 · 0 评论 -
Linux网络基础(10)——网络基础——DNS,NAT
DNS:DNS是一套从域名到映射到IP的系统。之前电脑中一个hosts文件完成。DNS域名服务器,有这个服务器来维护域名和ip的映射关系。DNS域名服务器如果挂了什么现象?网页挂了。但是你能打LOL。全球通用的8.8.8.8:谷歌维护的全球的根域名解析服务器。114.114.114.114也可以。NAT:解决IP地址不够用的主要手段, 是路由器的一个重要功能。...原创 2019-07-15 12:12:34 · 246 阅读 · 0 评论 -
Linux网络编程(9)——网络基础——数据链路层
数据链路层用于两个设备(同一种数据链路节点)之间进行传递。类似西安到北京可以坐飞机,坐火车……相邻节点之间用什么方式传输。源地址和目的地址是指网卡的硬件地址(也叫MAC地址)。MTU为硬件服务;MTU对于上层的影响非常明显,如果IP数据报超过MTU就会自动拆包。MTU对UDP的影响:这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着,如果UDP...原创 2019-07-15 10:33:02 · 413 阅读 · 0 评论 -
Linux网络编程(7)——网络基础—传输层
传输层:负责数据能够从发送端传输接收端。端口:就是代表一个唯一进程。端口号范围划分:(uint16_t)0 - 1023:知名端口号,HTTP,FTP,SSH等这些广为使用的应用层协议,他们的端口号都是固定的。1024 - 65535:操作系统动态分配的端口号,客户端程序的端口号,就是由操作系统从这个范围分配的。常见的两个问题:一个进程能否绑定多个端口号。——可以 一个...原创 2019-07-07 14:19:56 · 169 阅读 · 0 评论 -
Linux网络编程(6)——网络基础—应用层
应用层:协议:网络计算机服务端:#include "封装多线程TCP服务端.hpp"#include <sstream>int main() { TcpThraedServer server; server.Start("0.0.0.0", 9090, [](const std::string& req, std::string* resp){ ...原创 2019-06-28 19:53:18 · 239 阅读 · 0 评论 -
Linux网络编程(5)——多进程、多线程实现TCP简易中英文翻译
SOCKET://封装的形式实现#include <stdio.h>#include <cstdio>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <cstringt>#include <sys/socket.h...原创 2019-06-28 17:20:58 · 415 阅读 · 0 评论 -
Linux网络编程(4)——UDP实现中英文翻译的服务器
服务器://中英文服务器//用户输入英文单词,返回一个翻译出来的结果#include "封装UDP服务端.hpp"#include <unordered_map>int main() { UdpServer server; //lamdba 表达式中[] 可以写东西:把lambda 外部变量捕获到lanbda 表达式里面 //& 按引用捕获 没有按值捕获...原创 2019-06-28 15:38:39 · 421 阅读 · 0 评论 -
Linux网络编程(2)——套接字编程(2)UDP协议实现(回显服务器)
sockaddr_in 这个结构比较关键。UDP:服务器:#include <stdio.h>#include <sys/socket.h> //socket相关#include <netinet/in.h>#include <arpa/inet.h>//htons()#include <cstringt> /...原创 2019-06-28 12:52:12 · 325 阅读 · 0 评论 -
Linux系统编程(13)——进程间通信-消息队列、信号量
消息队列:信号量:使用:头文件<semaphore.h>定义信号量:全局变量位置——sem_t sem; 释放:sem_destory(&sem); 初始化:sem_init(&sem, 0, 1);初始化信号量:第二个参数写为0,表示这个进程只能再当前进程使用第三个:既然是计数器,就有初始值,这里设为 1分别进行 p,...原创 2019-05-23 20:37:32 · 191 阅读 · 0 评论 -
通过多线程提高代码的执行效率例子
问题:假设一个很大的数组,把数组的每个元素进行乘方运算,在赋值返回数组中单线程实现:#include <stdio.h>#include<pthread.h> //头文件#include <unistd.h> //sleep头文件#include <sys/time.h>//问题:假设一个很大的数组,把数组的每个元素进行乘方运...原创 2019-05-30 18:06:11 · 702 阅读 · 2 评论 -
Linux系统编程(12)——进程间通信-共享内存
共享内存用同一个内存块,实现通信。共享内存使用方式:在内核中先创建共享内存对象(所用函数:frok,shmget) 多个进程附加到这个共享内存对象上(所用函数:shmat,和malloc很像) 就可以直接读写这个共享内存了所用函数:shmget函数:用来创建共享内存头文件:#include<sys/shm.h> 函数:int shm...原创 2019-05-23 20:19:23 · 287 阅读 · 0 评论 -
Linux系统编程(8)——进程控制--程序替换
进程的程序替换fork 创建的子进程,和父进程式共用一个代码块的,而事实上我们更需要创建出的子进程能够单独执行一份代码。程序替换不会创建新进程,也不会销毁进程。替换原理:pcb进程不变,从虚拟地址空间通过页表映射到物理地址空间,然后从磁盘的其他可执行文件,替换代码段和数据段。原有的堆,栈中的数据都不要了,根据新的代码执行过程重新构建堆,栈的内容。(类似双击exe执行一个程序的过程...原创 2019-05-14 14:49:48 · 288 阅读 · 0 评论 -
Linux系统编程(2)——进程概念
进程:一个可执行程序跑起来,操作系统就创建一个进程。PS:ps:显示当前进程ps aux:显示当前所有进程ps aux | less:分页显示所有进程(方便查看)注:前几个信息是:USER:进程创建用户;PID:身份标识符 ;cpu占用;MEM:内存占用空间......ps aux | grep test[进程名]:字符筛选显示所有进程(方便查看,这个是筛选test...原创 2019-05-06 21:32:36 · 216 阅读 · 0 评论 -
LInux基本工具——工程管理工具makefile详细介绍
工程管理工具目的:解决大型项目中模块之间的以来问题注:一般生成文件指令都是:gcc teat.c -g -o test 由test.c生成可执行文件testmakefile:这是四十多年前的工具,当前在实际工作中几乎都不会手写makefile文件,但是必须要学它,当前的现代C/C++工程管理工具本质都是通过自动化的方式生成,其原理也都归结于makefile。...原创 2019-05-01 15:58:32 · 983 阅读 · 0 评论 -
Linux常用工具——gcc、gdb及调试方法的详细介绍、工程管理工具
gccgcc <文件名> :编译成功 然后:./a.out 就运行成功 注:a.cou 就是默认的命名程序 gcc <文件名> -o <自定义文件名> 然后:./<自定义文件名> 就运行成功 -g:编译的时候保留调试信息,类似VS上的debug模式注:VS中debug和rele...原创 2019-05-01 15:21:46 · 832 阅读 · 0 评论 -
Linux文本编辑器——Vim快捷键、基本操作超详细介绍(内有行号设置以及配置Vim成为IDE(集成开发环境))
注:行号设置、配置Vim在文档最后:创建启动脚本栏~~~~Vim: 插入命令: 欲进入Vim编辑器(从命令提示符),输入:vim 文件名 <回车> i:普通模式按i是进入编辑模式,光标之前插入 i、ESC交替熟练使用编辑文本插入 注:配合h\j\k\l<左移/下行/上行/右移>(普通模式下使用)熟练掌握,因为会提高编码效率,同时可以装大佬...原创 2019-05-01 11:07:54 · 441 阅读 · 0 评论 -
Linux基础命令——超详细介绍
命令格式: 使用格式——命令名[选项参数] [操作对象FILE] 目录相关命令: lsls:浏览当前文件目录 注:每个用户都有家目录 每个目录下都有两个特殊的目录 : . (当前目录) ..(当前目录的上级目录) / home / test 是test 用户登陆主机进入的默认目录 这个目录叫做 test 用户的home 目录 ~:...原创 2019-04-30 18:58:49 · 467 阅读 · 0 评论 -
Linux权限——相关知识,详细介绍
权限: r 读 w 写 x 执行 任何一个文件具体的权限,针对不同的用户是不一样的 用户分类: 文件拥有者 u 文件所属同组 g 其他用户 o 所有用户 a 我/媳妇 客厅+主卧 儿子 客厅+次卧 路人甲 客厅...原创 2019-04-30 19:39:26 · 231 阅读 · 0 评论 -
Linux基础开发工具——Vim基础介绍
Linux基础开发工具: 现在的开发工具,像VS是一个IDE(集成开发环境) 包含着很多功能,但是前四个是核心的,必须的: 1.代码编辑器 2.编译器 3.调试器 4.工程管理工具 5.其他......原创 2019-04-30 20:19:14 · 556 阅读 · 0 评论 -
Linux系统编程(1)
冯诺依曼体系结构:CPU(核心)、存储器(内存+外存)、输入设备、输出设备注:内存内存小,速度快,成本高,断电之后丢失数据;外存内存大,速度慢,成本低,断电之后不掉数据。CPU也是能够存储少量的数据的,上面存数据的组件“寄存器”,访问速度特别快。冯诺依曼:计算机祖师爷之一操作系统(OS):一个管理的软件管理硬件设备:类似搭配驱动来运行什么硬件 管理软件资源操作系...原创 2019-05-01 18:43:20 · 198 阅读 · 0 评论 -
利用进程控制开发一个简单的minishell程序
步骤:打印提示符,并且让用户输入一个指令 解析输入的指令,找到相应的可执行程序 创建子进程,子进程进行程序替换,来加载可执行程序 父进程进行程序等待,等待子进程结束 子进程结束,父进程从等待中返回,循环执行 1//minishell#include<stdio.h>#include<stdlib.h>#include<unistd.h&g...原创 2019-05-16 15:05:06 · 413 阅读 · 0 评论 -
Linux系统编程(3)——trask_struct(PID,进程)的信息
trask_struct的信息(序):task_struct核心内容(最关键的两个是PID,内存指针):进程标识符(PID) 内存指针:告诉进程代码/数据都在内存的哪个位置 进程的状态:R(ready):就绪状态,进程在就绪队列中,就会处于这种状态。S(sleep):睡眠状态,暂时还轮不到。D:深度睡眠状态,密集的进行IO操作的时候经常出现,例如程序崩溃的时...原创 2019-05-09 18:19:29 · 191 阅读 · 0 评论 -
Linux系统编程(17)——线程控制-结束线程、等待线程、线程分离
结束线程1.让线程的入口函数结束执行------最常见最主要使用的结束方式2.pthread_exit:让本线程结束------但是很少使用它,它的参数是 void* 表示线程结束的返回结果(很少用到);如果exit 全部线程都没了,这个不能混淆了。exit 结束进程。void* ThreadEntry(void* arg) { //新线程入口,参数 (void)arg; ...原创 2019-05-30 17:08:13 · 650 阅读 · 0 评论 -
Linux系统编程(15)——线程的基本概念、和进程的区别
线程基础概念:线程相比进程的优点:创建和销毁开销更小 调度的开销更小 线程占用资源更小 注:原因是:线程用同一个虚拟地址空间线程相比进程的缺点:性能损失 健壮性降低(核心问题):一个线程异常终止会导致进程异常终止(因为同一个虚拟地址空间,注意是进程终止) 编程难度增大:1)对线程的可靠性要求更高 2)线程安全问题多线程/多进程应用场景:...原创 2019-05-28 13:27:46 · 327 阅读 · 0 评论 -
Linux系统编程(11)——进程间通信-概念、匿名管道pipe、命名管道mkfifo
为什么要进行进程间通信?进程之间具有独立性,每个进程都有自己的虚拟地址空间,进程A并不知道进程B的虚拟地址空间中的数据。这好比一个人不知道另一个人脑子中怎么想的一样。介质?进程间通信需要“介质”,两个进程都能访问到的公共资源。借助文件就可以完成进程间通信,这是最简单,最常见手段。操作系统专门提供的进程间通信方式:匿名管道 命名管道 消息队列 共享内存 ...原创 2019-05-23 18:16:12 · 442 阅读 · 0 评论 -
Linux系统编程(10)——基础IO(2)-重定向、动态库、静态库
重定向底层实现以及文件描述符的一些操作:#include<stdio.h>#include<unistd.h>#include<fcntl.h>int main(){ //重定向,依赖操作系统的底层实现 //把本来输出到显示器的文件 输出到文件中 //这是重定向的底层实现:同样的文件描述符,这个描述符绑定到新的文件的时候,它不再输出到原...原创 2019-05-21 20:11:25 · 312 阅读 · 0 评论 -
Linux系统编程(9)——基础IO(1)-open、read、write、文件描述符
打开文件上限:ulimit 可以查看文件打开数目,同时 ulimit -n <数字> 可以修改文件打开数目。也就是说文件打开数目是有上限的,但是可以根据自己的使用情况来调整。fread/fwrite/fopen/fclose 库函数read/write/open/close 系统调用函数(Linux提供的比较底层的文件操作)open头文件:#in...原创 2019-05-16 17:42:38 · 334 阅读 · 0 评论 -
Linux系统编程(7)——进程控制--进程等待
进程等待:进程等待:父进程对子进程进行进程等待,等待是为了读取子进程的运行结果进程等待的方法:wait方法 (阻塞等待)头文件:#include<sys/types.h> #include<sys/wait.h> pid_t wait(int*status) 返回值:成功返回被等待进程pid,失败返回-1。 参数:输出型参数,获取子进程退出...原创 2019-05-14 13:02:58 · 359 阅读 · 0 评论