linux 管道 重定向 环境变量
linux 管道 重定向 环境变量输入输出重定向简单来讲,输入重定向就是将文件导入到命令中。输出重定向即将原本要输出到屏幕上的信息输出到指定文件中。
标准输入重定向 STDIN 文件描述符为 0 默认从键盘输入
标准输出重定向 STDOUT 文件描述符为 1 默认输出到屏幕
错误输出重定向 STDERR 文件描述符为 2 默认输出到屏幕
STDIO输入重定向中的符号及其作用
符号
作用
命令 < 文件
将文件作为命令的标准输入
命令 << 分界符
从标准输入中读取 知道遇见分界符
命令 < 文件1 > 文件2
将文件1作为命令的标准输入并将标准输出到文件2中
STDOUT输入重定向中的符号及其作用
符号
作用
命令 > 文件
将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件
将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件
将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>> 文件
将错误输出重定向到一个文件中(追加 ...
docker learn 4 网络
docker learn 4 网络docker允许通过端口映射的方式实现外部网络访问。容器之间也可以实现网络互联。
外部访问容器12345678910111213# -p 的格式如下 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort# -p 指定主机端口1000映射至容器端口80 可以多次使用 -p 来指定多个映射docker run -d -p 1000:80 nginx # 这时候可以在主机中使用nginx的反向代理将某sever来的流量转发至1000端口,继而转发到容器的80端口,实现访问。nginx中的配置如下server { server_name sing.cuimouren.cn; location / { proxy_pass http://localhost:1000/; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgra ...
docker learn 3 数据管理
docker learn 3 数据管理在容器中管理数据主要有以下两种方式:数据卷volumes和挂载主机目录bind mounts
数据卷的使用类似于linux系统中对目录或者文件按进行mount,镜像中指定为挂载点的目录中的文件会被隐藏掉可以显示的是挂载的数据卷
1234567891011#创建一个数据卷docker volume create myvolumedocker volume lsdocker volume rmdocker volume inspect [volume name]#启动一个容器,并加载数据卷到容器的指定目录docker run -it --mount source=myvolume,target=/webapp ubuntu:20.04 bash#上面这条命令将target指定的容器中的/webapp目录为myvolume在该容器内的挂载点。容器中任何对/webapp的操作都会直接作用于myvolume。#假如有两个容器同时挂载了myvolume,则加入容器a想其中新建了一个文件file则容器2也可以在他的/webapp目录下找到这个file。#vol ...
docker learn 2 容器
docker learn 2 容器简单来讲,容器是独立运行的一个或者一组应用,以及他们的运行环境。
容器基本操作12345678910#容器基本操作docker container lsdocker container prune #删除处于终止态的容器docker container logsdocker container stopdocker container startdocker container resatrtdocker container rmdocker attach [container id/name]docker exec [option] <container id/name> <CMD>
基于镜像新建一个容器并启动 docker run
启动终止态的容器
docker run常用参数
1234-i 让容器的标准输入保持打开-t 打开一个伪终端并绑定在容器的标准输入上-d 让容器在后台执行而不是将结果打印在当前的宿主机上,想要获取容器输出可以使用 docker container logs [container id or n ...
docker learn 1 镜像
docker learn 1 镜像docker相关概念镜像 image对于linux系统来讲,在启动的时候会挂在root文件系统(filesystem)为用户空间提供支持,docker image就相当于一个root文件系统,docker没有自己的硬件虚拟化。严格来讲,镜像不是一个具体的文件(like iso文件),而是由多层文件系统联合。
镜像在构建(build)的时候,会一层一层的进行构建,(通俗来讲,每一个命令即是一层),前一层是后一层的基础,每一层的改变会永远跟随着镜像,就像git一样。因此,在构建镜像的时候要做到每一层只包含该层所需要的东西,而不要加入一些额外的东西,任何额外的东西需要在构建结束时进行清理。
容器 container镜像和容器的关系就好像时类和实例一样,在构建完成一个镜像时,就好像写完了一个类,而后还需要进行实例化出一个容器来。每一个容器拥有自己独立的文件系统,互相隔离,就好像是一个独立的操作系统,但是容器的实质是一个进程。每一个容器运行时以其镜像作为基础层,并在其上创建自己的存储层。
docker不是虚拟机,容器就是一个进程,所以容器内的所有应用全部应 ...
CRT learn 01
CRT 01
开了一个新坑,学习CRT.在学习json和自制数据库系统的时候,我发现我对C语言的掌握太肤浅了,但是又苦于找不到合适的路径去学习,不过我发现大多数知识都可以在微软的官方文档上找到,所以就在微软官方上学习一下CRT.
参考:
微软官方文档
我将按照文档上写的一样按照类别进行学习。
参数访问未完成
缓冲区操作_memccpy
数据结构 十 排序
数据结构 十 排序sort.h对于基数排序的实现,这位大神太厉害了。代码
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#ifndef SORT_H#define SORT_H#include <stdio.h>#include <stdbool.h>#include <stdlib.h>#include <stdint.h>#include <string.h>/*1. 内部排序 1. 插入排序 1. 直接插入排序 2. 折半插入排序 3. 希尔排序 2. 交换排序 1. 冒泡排序 2. 快速排序 3. 选择排序 1. 简单选择排序 2. 堆排序 4. 归并排序 5. 基数排序 2. 外部排序 1. */void printf ...
json learn
json learn之前收藏过miloyip的json教程,现在想学习一下。
为什么现在要学习这个呢?
首先这几天我对未来的方向越发的清晰了,未来我想从事有关计算机图形学底层相关职业,所以我想重新学习计算机图形学,将之前的游戏引擎重新实现一遍。
想要重写之前的游戏引擎就必须将模型加载自己实现一次,虽然github上有一个tinyobj_loader的项目,但是我现在看不懂,还需要学习更加多的底层知识才可以。
要想增强自己的底层开发能力,必须跟着几个项目进行学习。目前可以学习的资源有:tinyobj_loader,database, 郑刚的操作系统,c4编译器等。
目前我正在准备考研,所以并没有太多时间,只能先学习一些小的项目,不然的话做项目上瘾就没有时间准备考研了。
思来想去,目前来看最合适的项目就是这个json教程了。学完这个教程可以实现一个递归下降的解析器,这又为学习C4做了准备,同时也为CDB做了准备。
于是决定学习json
从零开始的JSON库教程
GitHub
json简介json又六种数据类型,如下:
null 表示为 null
布尔值 表示为 true fals ...
数据结构 九 堆
数据结构 九 堆堆的定义heap,可以看作一棵树,只不过在性质方面和树不一样。
堆的性质
堆是一颗完全树。
堆的父结点值总是大于等于(最大堆)或者总是小于等于(最小堆)其孩子结点的值。
二叉堆以最大堆为例
二叉堆满足堆的定义,二叉堆是一个完全二叉树。
当将一个数组看成一个堆的时候,若从零开始,则 2n+1 2n+2 为 n 的孩子。
二叉堆的算法调整堆的调整算法即将堆中一个子树进行调整,令其满足堆的定义。这种调整的方法如下。
若根的值小于孩子的值,则令其与较大的孩子进行交换
令交换后的结点作为新根重复1直到没有孩子或者比孩子的值要大。
新建一个堆,将一个无序的数组调整为一个堆,算法如下:
从最后一个非叶子结点向前遍历直到根节点
对每一个结点进行上述的调整算法。
若对一个已经成序的堆进行调整只需要调整一个改变的结点即可,因为此时只有要处理的结点无序,其余结点都有序。
插入
将插入到数据插入的二叉堆的最后面
将该结点的值和其父结点进行比较,若大于其父结点的值则与父结点交换,递归直到无法上浮。
堆的一个重要应用就是堆排序,即将一个数组看成一个堆,进行排序。
删除
...
数据结构 八 图
数据结构 八 图无向图无向图的邻接矩阵实现接口声明123456789101112131415161718192021222324252627282930313233343536373839404142434445//无向图 邻接矩阵#ifndef _GRAPH_H_#define _GRAPH_H_#include <iostream>#include <time.h>#include <stdlib.h>#include <memory.h>#include <stack>#include <deque>#define VERTEX_MAX 100typedef struct _VERTEX{ int key;} * Vertex;typedef struct _GRAPH{ //顶点集合 //顶点数量 //边的数量 //边的集合 使用邻接矩阵或者邻接表进行表示 Vertex vertex[VERTEX_MAX]; int vertex_nu ...
数据结构 七 红黑树
数据结构 七 红黑树听说红黑树很难,不知道究竟有多难,现在来试一下。
参考资料
定义红黑树是一个自平衡的二叉查找树,每一个结点增加一个标识结点颜色的位(红色或者黑色),通过对任何一条从根节点到叶子的路径上结点着色方式的限制,红黑树保证不存在一条路径会比其他路径长两倍。红黑树不保证绝对的平衡。
nil:指的是红黑树的叶子,但是红黑树的叶子别的树不同,这里的叶子指的是空指针域,可以看作每一个child指针若为null则指向空指针域nil
性质
每一个结点是红的或者黑的。
根节点是黑色的。
空指针域为黑色的。即NULL指针看作黑色。
红色结点的孩子都是黑色的。
对于每一个结点,到以其为根的叶子结点所经过的黑色结点的数目相同。(这里的叶子结点指的是空指针域,以哨兵装入其内)
算法左旋将当前结点旋转为其右孩子的左孩子,并将其右孩子的左孩子设置为当前节点的右孩子。
右旋将当前结点旋转为其左孩子的右孩子,并将其左孩子的右孩子设置为当前节点的左孩子。
插入首先假设插入的结点为红色。因为红色结点不会影响红黑树这一条性质 对于每一个结点,到其叶子结点的所有路径上黑色结点的数目相同。
插入的结点为根节点或 ...
leedcode 初级算法 树
leedcode 初级算法 树链接
二叉树的最大深度题目说明求二叉树的最大深度
题目解析使用递归求解即可
1234567int maxDepth(struct TreeNode* root){ if(root==NULL) return 0; int left=maxDepth(root->left); int right=maxDepth(root->right); return (left>=right?left+1:right+1);}
验证二叉搜索树题目描述给定一个二叉树,判断其是否是一个有效的二叉搜索树。
题目解析 方法一递归验证即可。
或者中序遍历也可。
1234567891011121314bool is_right(struct TreeNode* root,long low,long up){ if(root==NULL) return true; if(root->val<=low||root->val>=up) r ...