
基础知识
计算机基础知识、常见问题,开源原理整理。
MachinePlay
一只R&D社畜,兴趣驱动,学习、分享、沉淀。
筚路蓝缕,以启山林。
展开
-
静态库和动态库
1.什么是库库lib是编译好的二进制代码,可以被操作系统载入内存执行,一般是预先编译好的函数的集合,可以通过头文件链接到库文件,执行已经编译好的代码段。库一般分为静态库(static lib,在linux系统一般是.a文件)和动态库(dynamic lib,也叫共享库,在linux系统一般是.so文件)。二者的不同点在于被载入的时间不同:静态库.a在编译的过程中会被编译到可执行文件,也就是说会增大可执行文件的体积。动态库则是在执行的过程中才会去读取.so文件,不用编译进可执行程序,因此可执行程序体原创 2020-08-03 01:55:57 · 564 阅读 · 0 评论 -
终端复用神器Tmux使用教程
文章目录1.什么是Tmux2.使用tmux2.1安装Tmux2.2 启动、进入、分离与退出Session`启动tmux``分离session``回到session``退出Session``重命名Session`2.3Tmux窗口扩展和切换`垂直划分``水平划分``在窗口间移动光标`交换窗格位置。3.常用操作3.1经典场景3.2经典快捷键4.其它1.什么是TmuxTmux是一个终端复用软件 T...原创 2020-04-02 04:30:41 · 2227 阅读 · 0 评论 -
Makefile简单入门
最近工作编译程序一直在用别人写的Makefile,但是没有系统的学习过,趁着放假学一波makefile0x00 Makefile 概述一个企业级项目,通常会有很多源文件,有时也会按功能、类型、模块分门别类的放在不同的目录中,有时候也会在一个目录里存放了多个程序的源代码。这时,如何对这些代码的编译就成了个问题。Makefile 就是为这个问题而生的,它定义了一套...原创 2020-02-10 04:17:55 · 176 阅读 · 0 评论 -
gcc参数详解
gcc 与 g++ 分别是 gnu 的 c & c++ 编译器 gcc/g++ 在执行编译工作的时候,总共需要4步:1、预处理,生成 .i 的文件[预处理器cpp]2、将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs]3、有汇编变为目标代码(机器代码)生成 .o 的文件[汇编器as]4、连接目标代码, 生成可执行程序 [链接器ld]过程如下:...原创 2020-02-10 03:19:32 · 404 阅读 · 0 评论 -
如果系统使用阴影文件,那么如何取得加密口令?
如果系统使用阴影文件,那么如何取得加密口令?无法获取,因为shadow文件只允许root用户访问,普通用户无法取得。假设你有超级用户权限,并且系统使用了阴影口令,重新考虑上一道习题。#include <iostream>#include <shadow.h>int main (int argc, char *argv[]){ string ...原创 2020-02-04 22:34:37 · 248 阅读 · 0 评论 -
c时间函数strftime、struct timespec 和 struct timeval
时间和日期由UNIX内核提供的基本时间服务是计算自协调世界时(Coordinated Universal Time,UTC)公元1970年1月1日00:00:00这一特定 时间以来经过的秒数。1.10节中曾提及这种秒数是以数据类型time_t表示 的,我们称它们为日历时间。日历时间包括时间和日期。UNIX在这方 面与其他操作系统的区别是:(a)以协调统一时间而非本地时间计 时;(...原创 2020-02-04 22:19:55 · 1468 阅读 · 0 评论 -
计算可由time_t数据类型表示的最近时间。如果超出了这一时间将会如何?
计算可由time_t数据类型表示的最近时间。如果超出了这一时间将会如何?C++11标准规定long类型最少占32位,在我的计算机上,系统使用long int来实现time_t,实际使用64位来表示long类型,因此其取值值范围为 -9223372036854775808~9223372036854775807,由于该值特别大,2900亿年后才会溢出,此时宇宙可能都不存在了。对于某...原创 2020-02-04 22:45:42 · 590 阅读 · 0 评论 -
Linux读取系统信息
系统标识POSIX.1定义了uname函数,它返回与主机和操作系统有关的信息。#include <sys/utsname.h>int uname(struct utsname *name);返回值:若成功,返回非负值;若出错,返回-1 通过该函数的参数向其传递一个 utsname 结构的地址,然后该函数填写此结构。POSIX.1只定义了该结构中最少需提供的字...原创 2020-02-03 04:05:24 · 216 阅读 · 0 评论 -
linux系统信息读取小程序
获取内核版本、架构、用户名、终端、目录image.png/* * @Author: machineplay * @Date: 2020-02-05 03:04:30 * @Description: only for fun */#include <iostream>#include <stdio.h>#include <...原创 2020-02-05 05:42:50 · 123 阅读 · 0 评论 -
内存流
我们已经看到,标准I/O库把数据缓存在内存中,因此每次一字符 和每次一行的I/O更有效。我们也可以通过调用setbuf或setvbuf函数让 I/O库使用我们自己的缓冲区。在SUSv4中支持了内存流。这就是标准 I/O流,虽然仍使用FILE指针进行访问,但其实并没有底层文件。所有 的I/O都是通过在缓冲区与主存之间来回传送字节来完成的。我们将看 到,即便这些流看起来像文件流,它们的...原创 2020-01-30 15:56:11 · 408 阅读 · 0 评论 -
简单的结构体序列化
#include <iostream>#include <unistd.h>#include <stdio.h>#include <fcntl.h>#include <sys/stat.h>#include <string.h>class A{public: int double_data...原创 2020-01-30 01:33:34 · 1027 阅读 · 0 评论 -
dup和dup2函数实现
dupunix-liked操作系统中,复制文件描述符的函数dup和dup2int dup(int i)int dup(int i , int cmd, ***)由于题目要求不能使用fcntl函数,所以考虑使用dup函数来实现,思路如下:首先对于参数fd2,应当大于等于当前未使用的最小文件描述符,那么如何确定这个最小值呢?想到dup函数的返回值就是dup函数被调用前最...原创 2020-01-21 17:30:37 · 345 阅读 · 0 评论 -
大小端判断方法和转换
1.什么是大小端?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大...原创 2020-01-20 16:15:52 · 1068 阅读 · 0 评论 -
TOCTTOU错误
openat函数是POSIX.1最新版本中新增的一类函数之一,希望解决 两个问题。第一,让线程可以使用相对路径名打开目录中的文件,而不 再只能打开当前工作目录。同一进程中的所有 线程共享相同的当前工作目录,因此很难让同一进程的多个不同线程在 同一时间工作在不同的目录中第二,可以避免time-of-check-to-time-ofuse(TOCTTOU)错误。TOCTTOU错误...原创 2020-01-17 15:58:14 · 681 阅读 · 0 评论 -
深入了解C read/write函数和cat命令实现
1.文件描述符 文件描述符(file descriptor)通常是一个小的非负整数,内核用以 标识一个特定进程正在访问的文件。当内核打开一个现有文件或创建一 个新文件时,它都返回一个文件描述符。在读、写文件时,可以使用这 个文件描述符。2.标准输入、标准输出和标准错误 按惯例,每当运行一个新程序时,所有的 shell 都为其打开 3 个文 件描述符,即标准输入(standard ...原创 2020-01-13 17:41:36 · 3621 阅读 · 0 评论 -
Shell原理以及自己编写一个简单的Shell
程序和进程1.程序程序(program)是一个存储在磁盘上某个目录中的可执行文件。 内核使用exec函数(7个exec函数之一),将程序读入内存,并执行程 序2.进程和进程ID程序的执行实例被称为进程(process)。本书的每一页几乎都会使 用这一术语。某些操作系统用任务(task)表示正在被执行的程序。 UNIX系统确保每个进程都有一个唯一的数字标识符,称为进程 ID(...原创 2020-01-13 20:17:50 · 1062 阅读 · 0 评论 -
size_t、_t结尾基本系统数据类型解析
工作中经常用到size_t, uint64_t 这种_t结尾的类型。这些类型是与系统实现无关的基本系统数据类型。比如int 在16位机器和64位机器上范围不同,而int64_t不论在任何机器上都是相同的头文件<sys/types.h>中定义了某些与实现有关的数据类型,它们被 称为基本系统数据类型(primitive system data type)。还有很多这种...原创 2020-01-15 17:03:46 · 236 阅读 · 0 评论 -
dirent.h解析和ls命令实现
前段时间美团面试让写非递归遍历文件夹里的所有文件(文件夹中可能有文件夹),当时用了个树层次遍历写了代码,面试官好像不熟悉C的库,当时也没解释,在这里复习一下C标准库,以后面试面试官不熟悉就直接看博客把direntdirent.h是用于目录操作的头文件,linux 默认在/usr/include目录下(会自动包含其他文件),常见的方法如下:The <dirent.h>...原创 2020-01-13 15:25:36 · 483 阅读 · 0 评论 -
HTTP详解
1.什么是HTTP?HTTP是超文本传输协议 Hyper Text Transfer Protocol的缩写,是利用万维网将超文本从服务器传输到本地客户端的协议。HTTP是一个基于TCP/IP通信协议的应用层协议。2.HTTP工作原理HTTP工作于客户端-服务器框架,浏览器作为客户端向服务器发送HTTP请求,服务器接收到请求后发送HTTP响应,默认使用80端口。HTTP具...原创 2019-06-27 16:45:07 · 139 阅读 · 0 评论 -
CDN原理及为自己的网站部署
CDN是什么?CDN (Content Delivery Network or Content Ddistribute Network)内容分发网络。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。类似分布各地的物流仓储网络,CDN网络可以将源站的内容缓存到分布全球的CDN节点,根据用户的访问IP,就近连接CDN,提高网站响应速...原创 2019-03-26 11:32:23 · 707 阅读 · 0 评论 -
计算机网络-运输层、应用层
一、运输层协议网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。UDP 和 TCP 的特点用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(...原创 2019-08-08 22:21:05 · 578 阅读 · 0 评论 -
计算机网络-物理层、数据链路层、网络层
1.概述计算机体系结构计算机网络五层协议application layer应用层:为特定应用程序通信的协议和规则,如DNS、HTTP,传输报文(message)为数据段transport layer运输层:为两台主机进程通信提供通用的数据传输服务。应用层协议很多,定义传输协议可以不断支持新的应用层协议。有两大协议:传输控制协议TCP协议:提供面向连接的、可靠的...原创 2019-08-06 00:45:52 · 1862 阅读 · 0 评论 -
[c/c++]4.fork、vfork、clone和写时拷贝(copy on write)技术
进程创建进程创建首先说明Linux下的进程与线程比较相近。这么说的一个原因是它们都需要相同的数据结构来表示,即task_struct。区别在于一个有独立的用户空间,一个是共享的用户空间(如果完全没有用户空间则是内核线程,不需要)。Linux的用户进程不能直接被创建出来,因为不存在这样的API。它只能从某个进程中复制出来,再通过exec这样的API来切换到实际想要运...原创 2020-02-16 07:59:01 · 563 阅读 · 0 评论 -
[c/c++] 7.signal函数
函数signalUNIX系统信号机制最简单的接口是signal函数。#include <signal.h> void (*signal(int signo, void (*func)(int)))(int);返回值:若成功,返回以前的信号处理配置;若出错,返回SIG_ERRsignal函数由ISO C定义。因为ISO C不涉及多进程、进程组以及终 端I...原创 2020-02-21 01:19:53 · 317 阅读 · 0 评论 -
[c/c++]2.malloc、calloc、realloc
储存空间动态分配image.pngISO C说明了3个用于存储空间动态分配的函数。(1)malloc,分配指定字节数的存储区。此存储区中的初始值不确 定。(2)calloc,为指定数量指定长度的对象分配存储空间。该空间中 的每一位(bit)都初始化为0。(3)realloc,增加或减少以前分配区的长度。当增加长度时,可能 需将以前分配区的内容移到另一个足够大...原创 2020-02-15 10:26:05 · 273 阅读 · 0 评论 -
[c/c++]3.如何查看和更改程序运行栈的大小
进程内存布局image.png我们写程序运行栈的栈帧保存在栈区,函数调用深度太多将导致爆栈栈的大小有上限,每个进程可以指定软上限,操作系统可指定硬上限linux查看栈上限方法linux可以通过ulimit命令查看栈上限和设置上限ulimit -a 查看进程所有资源上限ulimit -s xx 修改栈上限也可以通过程序中调用函数修改每个进程都有一...原创 2020-02-15 23:36:15 · 4092 阅读 · 0 评论 -
[沙雕系列]c++代码混淆
代码混淆今天在网上看的一个沙雕项目,通过define 重命名 关键字等内容,使得代码不可读却可以正确运行,这里分享一下新建一个confused.h,把常用关键字define的六亲不认//confused.h#include <iostream>using namespace std;#define _ main()#define __ (#define ...原创 2019-06-13 18:54:56 · 1794 阅读 · 1 评论 -
[c/c++]1.内存储存空间布局
历史沿袭至今,C程序一直由下列几部分组成:内存布局image.png代码段:程序的所有指令会存放在这个区域,这是已经编译后的机器码。这是由CPU执行的机器指令部分。通常,正文段是可共 享的,所以即使是频繁执行的程序(如文本编辑器、C编译器和shell 等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防 止程序由于意外而修改其指令。字面量池是程...原创 2020-02-15 09:36:12 · 169 阅读 · 0 评论 -
[c/c++]6. exec函数
execimage.png曾提及用fork函数创建新的子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用磁盘 上的一个新程序替换了当前进程的正文段、数据段、堆段和栈段。有7种不同的e...原创 2020-02-20 00:38:08 · 3304 阅读 · 0 评论 -
[c/c++]5.wait、waitpid、waitid,wait3、4 exit和,孤儿、僵尸进程
1.函数exitimage.png进程有5种正常终止及3种异常终止方式。5种正常终 止方式具体如下。(1)在main函数内执行return语句。如在7.3节中所述,这等效于调 用exit。(2)调用exit函数。此函数由ISO C定义,其操作包括调用各终止 处理程序(终止处理程序在调用atexit函数时登记),然后关闭所有标准 I/O流等。因为ISO C并不处...原创 2020-02-20 00:04:55 · 2119 阅读 · 1 评论 -
[c/c++]1.堆、栈内存储存空间布局
历史沿袭至今,C程序一直由下列几部分组成:内存布局代码段:程序的所有指令会存放在这个区域,这是已经编译后的机器码。这是由CPU执行的机器指令部分。通常,正文段是可共 享的,所以即使是频繁执行的程序(如文本编辑器、C编译器和shell 等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防 止程序由于意外而修改其指令。字面量池是程序初始化时的一些字符串字面量,在程序中用于显...原创 2020-03-20 21:15:39 · 370 阅读 · 0 评论