我的博客发布流程
本文主要总结了日常发布博客所需要的一些命令,提高日后博客发布的效率,使之流程化,将更多的关注度放在博客内容的创作上而非繁琐的发布流程。该博客作为参考,方便查阅!
无题
mmap和mumap函数
一、传统的读写文件
一般来说,修改一个文件的内容需要如下3个步骤:
把文件内容读入到内存中。
修改内存中的内容。
把内存的数据写入到文件中。
过程如图 1 所示:
如果使用代码来实现上面的过程,代码如下:
read(fd, buf, 1024); // 读取文件的内容到buf... // 修改buf的内容write(fd, buf, 1024); // 把buf的内容写入到文件
从图 1 中可以看出,页缓存(page cache) 是读写文件时的中间层,内核使用 页缓存 与文件的数据块关联起来。所以应用程序读写文件时,实际操作的是 页缓存。
二、使用 mmap 读写文件
从传统读写文件的过程中,我们可以发现有个地方可以优化:如果可以直接在用户空间读写 页缓存,那么就可以免去将 页缓存 的数据复制到用户空间缓冲区的过程。
那么,有没有这样的技术能实现上面所说的方式呢?答案是肯定的,就是 mmap。
使用 mmap 系统调用可以将用户空间的虚拟内存地址与文件进行映射(绑定),对映射后的虚拟内存地址进行读写操作就如同对文件进 ...
无题
树莓派mysql安装
首先更新源
sudo apt-get updatesudo apt-get upgrade
不更新源的话后面无法安装
安装mysql
实测树莓派中只能安装mariadb
sudo apt-get install mariadb-server-10.0
ubuntu系统可以使用sudo apt-get install mysql-server
安装完成成默认只有root用户有登录权限,使用sudo mysql即可登录
修改默认密码
由于没有设置密码,只能在本地使用root账户登录,如果想要非root账户登录mysql,可以先进入mysql,输入如下命令:
alter user root@localhost identified with mysql_native_password by 'cai123';
或者是
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'cai123';flush privilege ...
无题
为什么要使用单例模式
日志系统的同步写入与异步写入
在 C++ 日志系统中,同步写入和异步写入是指日志消息写入到日志文件或其他输出设备的方式。
同步写入:当程序产生一条日志消息时,它会立即将该消息写入到日志文件或其他输出设备中。这种方式的优点是简单易实现,且能够保证日志消息的实时性。但是,由于写入操作可能会阻塞程序的执行,因此同步写入可能会影响程序的性能。
异步写入:当程序产生一条日志消息时,它不会立即将该消息写入到日志文件或其他输出设备中,而是将其存储在内存缓冲区中。然后,由一个单独的线程负责将缓冲区中的日志消息批量写入到日志文件或其他输出设备中。这种方式的优点是能够减少写入操作对程序性能的影响。但是,由于日志消息不是立即写入,因此异步写入可能会影响日志消息的实时性。
同步写入的实现就是有日志的时候调用ofstream.write()或者是fputs()函数直接写入到日志文件就行,属于比较简单的文件操作,但是直接写入文件可能会阻塞程序的执行
基础的函数
fputs 字符串写入到指定流中
int fputs(const char*str,FILE* stream)
fput ...
无题
一、如何让程序在后台运行
如果要运行程序,在命令提示行下输入程序名后回车,程序被执行,然后等待程序运行完成,在程序运行的过程中,也可以用Ctrl+c中止它。
在实际开发中,我们需要让程序在后台运行,没有界面,没有用户输入数据,例如socket服务端程序book250。
如果想让程序在后台运行,有两种方法。
1、加“&”符号
如果想让程序在后台运行,执行程序的时候,命令的最后面加“&”符号。如:./book250 &,程序就在后台运行了。
在后台运行的程序,用Ctrl+c无法中断,并且就算终端退出了,程序仍在后台运行。如果终端退出了,后台运行的程序将由系统托管。
在第一张图中,book250的父进程是12178,第二张图中,book250的父进程是1。
为了不影响接下来的学习,用killall book250指令让book250程序退出。
2、采用fork
另一种方法是采用fork,主程序执行fork,生成一个子进程,然后父进程退出,留下子进程继续运行,子进程将由系统托管。在book250的main函数后增加以下代码: if (fork()>0) retur ...
无题
基础篇
通用语法及分类
DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)
DML: 数据操作语言,用来对数据库表中的数据进行增删改
DQL: 数据查询语言,用来查询数据库中表的记录
DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限
DDL(数据定义语言)
数据定义语言
数据库操作
查询所有数据库:
SHOW DATABASES;
查询当前数据库:
SELECT DATABASE();
创建数据库:
CREATE DATABASE [ IF NOT EXISTS ] 数据库名 [ DEFAULT CHARSET 字符集] [COLLATE 排序规则 ];
删除数据库:
DROP DATABASE [ IF EXISTS ] 数据库名;
使用数据库:
USE 数据库名;
注意事项
UTF8字符集长度为3字节,有些符号占4字节,所以推荐用utf8mb4字符集
表操作
查询当前数据库所有表:
SHOW TABLES;
查询表结构:
DESC 表名;
查询指定表的建表语句(展示建表时的详细信息,如每个字段的注释等):
SHOW CREATE TABLE 表名 ...
无题
多线程基本知识
查看线程:ps -xH|grep 进程名 ;查看进程:ps -ef |grep 进程名
main函数为主进程/主线程,创建的线程为子线程
线程资源是共享的,使用相同的地址共享全局变量和对象
不能在子线程中使用exit,否则整个进程会退出,一般使用pthread_exit(0)
子线程退出尽量不要使用return,否则会报错,可以写为 return (void *)0;
代码示例:
#include<stdio.h> #include <pthread.h> #include <unistd.h> void* handler1(void* arg); void* handler2(void* arg); int var=0; int main() { pthread_t pthid1,pthid2; if(pthread_create(&pthid1,NULL,handler1,NULL)!=0) & ...
无题
select、poll、epoll代码
select
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <arpa/inet.h>#include <sys/fcntl.h>// 初始化服务端的监听端口。int initserver(int port);int main(int argc,char *argv[]){ if (argc != 2) { printf("usage: ./tcpselect port\n"); return -1; } // 初始化服务端用于监听的socket。 int listensock = initserver(atoi(argv[1])); printf("listensock=%d\n",listensock); ...