自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 收藏
  • 关注

原创 基于docker部署mysql主从复制

1. 拉取镜像docker pull mysql:5.72. 创建主从配置文件2.1 主机配置在/root/work_space/mysql_study/node1/下创建my.cnf文件[mysqld]#主服务器唯一IDserver-id=1#启用二进制日志log-bin=mysql-bin# 设置不要复制的数据库(可设置多个)binlog-ignore-db=mysqlbinlog-ignore-db=information_schema#设置需要复制的数据库 需要复制的主数

2022-04-17 13:37:37 1065

原创 protobuf 入门

介绍了protobuf基本概念、优缺点、与protobuf在C++上的基本使用

2022-04-10 10:03:22 2375

原创 《UNIX环境高级编程》笔记 第十九章-伪终端

1. 概念伪终端这个术语是指,对于一个应用程序而言,它看上去像一个终端,但事实上它并不是一个真正的终端。下图是伪终端的一个典型安排通常,一个进程打开伪终端主设备,然后调用fork,子进程建立一个新的会话,打开一个相应的伪终端从设备,将其文件描述符复制到stdin、stdout、stderr。然后调用exec执行新程序。伪终端从设备成为了子进程的控制终端。对于伪终端从设备上的用户进程来说,其stdin、stdout、stderr都是终端设备。通过这些描述符,用户进程能够处理第18章中的所有终端I/O

2021-11-20 16:33:19 2235 1

原创 《UNIX环境高级编程》笔记 第十八章-终端IO

1. 终端I/O概述1.1 规范和非规范模式终端I/O有两种不同的工作模式:规范模式输入处理:对终端输入以行为单位进行处理。对于每个读请求,最多返回一行。非规范模式输入处理:输入字符不装配成行若不做特殊处理,则终端I/O默认模式是规范模式。处理整个屏幕的程序(如vi编辑器)使用非规范模式。1.2 特殊输入字符POSIX.1定义了11个特殊输入字符,例如文件结束符(Ctrl+D)和挂起字符(Ctrl+Z),其中9个可以更改。1.3 终端设备的输入输出队列终端设备由位于内核中的终端驱动程序

2021-11-19 22:26:15 737

原创 《UNIX环境高级编程》笔记 第十七章-高级进程间通信

1. UNIX域套接字1.1 概念这种形式的IPC可以在同一计算机系统上运行的两个进程之间传送打开文件描述符UNIX域套接字用于在同一台计算机上运行的进程之间的通信。这里要和第十六章介绍的内容区别,第十六章介绍的是因特网域套接字,而这里介绍UNIX域套接字,即通信域不同。因特网域主要应用于不同主机进程间通信,UNIX域只能应用于同一台主机上进程间的通信。虽然因特网域套接字也可用于同一计算机进程间通信,但是UNIX域套接字效率更高。因为UNIX域套接字不需要TCP/IP网络协议栈处理,UNIX

2021-11-18 23:12:08 1445

原创 《UNIX环境高级编程》笔记 第十六章-网络IPC套接字

1. 套接字描述符套接字是通信端点的抽象。如同使用文件描述符访问文件一样,应用程序用套接字描述符访问套接字。其实在UNIX中套接字描述符就是一种文件描述符,许多处理文件描述符的函数(如read、wirte)可以用于处理套接字描述符。套接字通信是双向的。即可以通过一个套接字接收或发送数据1.1 socket函数通过socket函数创建一个套接字。成功调用返回的文件描述符将是当前未为进程打开的最低编号的文件描述符。int socket(int domain, int type, int protoco

2021-11-17 15:40:36 1127

原创 《UNIX环境高级编程》笔记 第十五章-进程间通信

1. 匿名管道匿名管道是UNIX系统IPC(进程间通信)最古老的方式,所有UNIX系统都提供这种通信机制匿名管道有以下局限性:历史上,它们是半双工的(数据只能在一个方向上流动)。现在某些操作系统提供全双工匿名管道,但是为了可移植性,应该按照半双工来进行编程管道只能在具有公共祖先的两个进程间使用。通常一个管道由一个进程创建,在进程fork之后,父子进程之间通过该管道进行通信。命名管道(FIFO)没有第二种限制,UNIX域套接字没有这两种限制1.1 pipe函数通过pipe函数创建管道int

2021-11-15 13:39:35 1378

原创 《UNIX环境高级编程》笔记 第十四章-高级IO

1. 非阻塞I/O系统调用分为两类:低速系统调用和其他系统调用。低速系统调用是可能会使进程永远阻塞的一类系统调用,包括:如果某些文件类型(如读管道、终端设备和网络设备)的数据并不存在,读操作可能使调用者永远阻塞。如果数据不能被相同的文件类型立即接受(如管道中无空间、网络流控制),写操作可能会使调用者永远阻塞。在某种条件发生之前打开某些文件类型可能会发生阻塞(例如以只写模式打开FIFO,那么在没有其他进程用读模式打开该FIFO时也要等待)对已经加上强制性记录锁的文件进行读写某些ioctl操作

2021-11-11 19:55:25 456

原创 《UNIX环境高级编程》笔记 第十三章-守护进程

1. 概念守护进程(daemon)是生存期长的一种进程。它们常常在系统引导装入时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。Linux的大多数服务就是用守护进程实现的。这些守护进程名通常以d结尾,如inetd提供网络服务,sshd提供ssh登录服务,httpd提供web服务等待。大多数守护进程都以超级用户权限运行。所有守护进程都没有控制终端。用户层守护进程缺少控制终端可能是守护进程调用了setsid的结果(setsid会断开与控制终端的联系)。大多数用户

2021-11-08 20:50:28 998

原创 《UNIX环境高级编程》笔记 第十二章-线程控制

1. 线程限制UNIX操作系统对于线程操作有一些限制。如下图所示,可以通过sysconf函数进行查询2. 线程属性2.1 线程属性概念对于与线程相关的对象类型,一般都有一个属性类型与之关联(如线程和线程属性关联、互斥量和互斥量属性关联):有一个初始化属性对象的函数,把属性设置为默认值有一个销毁属性对象的函数,即释放属性对象资源一个属性对象可以代表多个属性。属性对象对应用程序不透明,因此应用程序不需要了解属性对象结构实现细节,而是通过指定函数与之交互。属性对象中的每个属性都有一个设置属性值

2021-11-06 17:28:19 398

原创 《UNIX环境高级编程》笔记 第十一章-线程

1. 线程概念每个线程都包含有表示执行环境所必须的信息(即每个线程都有属于自己的以下信息,不同线程之间不共享不一致):线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno变量以及线程私有数据。一个进程的所有信息对该进程的所有线程都是共享的:可执行程序的代码、程序的全局内存和堆内存、栈内存以及文件描述符2. 线程标识每个线程都有一个线程ID。与进程ID不同,进程ID在整个系统中是唯一的,但是线程ID只有在它所属的进程上下文中才有意义。线程ID通过pthread_t数据类型表示。对

2021-11-04 16:30:16 235

原创 《UNIX环境高级编程》笔记 第十章-信号

1. 信号概念信号是软件中断,提供了一种处理异步事件的方法。Unix早期版本提供的是不可靠信号,信号可能丢失。之后增加了可靠信号机制。每个信号都有一个名字,以3个字符SIG开头。如SIGABRT是终止信号,进程调用abort函数产生这种信号。SIGABRT信号:void abort(void);abort()首先解除了对SIGABRT(6)信号的阻止和忽略,然后为调用进程发送该信号(就像调用了 raise(SIGABRT)一样)。 导致进程的非正常终止,除非SIGABRT 信号被捕获,并且

2021-11-03 14:47:55 705

原创 《Unix环境高级编程》笔记 第九章-进程关系

1. 终端登录本节介绍经由终端登陆至UNIX系统所执行的各个程序。1.1 终端是什么 Terminalhttps://blog.csdn.net/yazhouren/article/details/78793367终端就是处理计算机主机输入输出的一套设备,它用来显示主机运算的输出,并且接受主机要求的输入,典型的终端包括显示器键盘套件,打印机打字机套件等1.2 终端类型终端文件(/dev/…)都是字符设备文件 (char)本地终端用VGA连接主机和显示器,用PS/2或者USB连接主机和键盘,

2021-10-30 18:09:41 418

原创 《UNIX环境高级编程》笔记 第八章-进程控制

1. 进程标识每个进程都用一个唯一的非负整数标识,即为进程id:pid。进程ID是可以复用的,当一个进程终止时,其进程ID就可以用来标识其他进程。系统中有一些专用进程:ID为0的进程称为调度进程(也称为交换进程swapper)。该进程为内核的一部分,他并不执行任何磁盘上的程序,因此也被称为系统进程idle 进程或因为历史的原因叫做swapper进程。它是在 linux 的初始化阶段从无到有的创建的一个内核线程。这个祖先进程使用静态分配的数据结构。在多处理器系统中,每个CPU都有一个进程0,主要

2021-10-28 12:37:57 572

原创 《UNIX环境高级编程》笔记 第七章-进程环境

1. 进程终止有八种方式使进程终止。其中5种是正常,它们是:从main函数返回调用exit调用_exit或_Exit最后一个线程从其启动例程返回从最后一个线程调用pthread_exit异常终止有三种方式:调用abort收到一个信号最后一个线程对取消请求做出响应1.1 退出函数以下三个函数用于正常终止一个程序。其中_exit和_Exit是系统调用,立即进入内核;exit则先执行一些清理工作,然后返回内核。void _exit(int status);void _Exit(

2021-10-26 11:22:48 290

原创 《UNIX环境高级编程》笔记 第六章-系统数据文件和信息

1. 口令文件 /etc/passwd用户每次登录都要使用口令文件,该文件中的登录项由以下几项(可能有其他更多的项)构成,不同项之间用冒号:分隔用户名:加密口令:数值用户id:数值组id:注释字段:初始工作目录:初始shellroot:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinsys:x:3:3:sys:/dev:/usr

2021-10-24 19:01:09 231

原创 《UNIX环境高级编程》笔记 第五章-标准IO库

1. 流和FILE对象在第三章的系统调用都是围绕文件描述符fd的。但是标准I/O库函数操作则是围绕流进行的。当使用标准I/O库打开或创建一个文件时,使用一个流与一个文件关联。当打开一个流时,标准I/O函数fopen返回一个指向FILE对象的指针。FILE对象包含了标准I/O库为管理该流需要的所有信息,包括用于实际I/O的文件描述符、指向用于该流缓冲区的指针、缓冲区长度、当前缓冲区中字符数、出错标志等。我们称指向FILE对象的指针(FILE*)称为文件指针2. 标准输入、标准输出、标准错误对每个进程

2021-10-23 17:22:43 366

原创 《UNIX环境高级编程》笔记 第四章-文件和目录

1. 函数stat、fstat、fstatat和lstat返回指定文件信息int stat(const char *pathname, struct stat *statbuf);int fstat(int fd, struct stat *statbuf);int lstat(const char *pathname, struct stat *statbuf);int fstatat(int dirfd, const char *pathname, struct stat *statbuf,

2021-10-21 21:33:22 2545

原创 《UNIX环境高级编程》笔记 第三章-文件IO

本章介绍关于文件I/O的系统调用。本章描述的函数都是不带缓冲的I/O,不带缓冲指的是每个read和write都调用内核中的一个系统调用。1. 文件描述符fd通常是一个非负整数,内核用它以标识一个特定进程正在访问的文件。当内核打开一个现有文件或创建一个新文件时,都返回一个文件描述符标准输入 标准输出 标准错误:每当运行一个新程序时,所有的shell都为其打开3个文件描述符,即标准输入、标准输出和标准错误。这三个描述符都链接至终端。在头文件#include <unistd.h>中,定义了三

2021-10-20 18:26:19 241

原创 《UNIX环境高级编程》笔记 第一章-UNIX基础知识

1. UNIX体系结构操作系统:一种软件,控制计算机硬件资源,提供程序运行环境。操作系统包含了内核和一些其他软件(如shell、公用函数库、应用程序等)。例如Linux就是GNU操作系统的内核,因此也称为GNU/Linux操作系统。内核的接口称为系统调用,公用函数库构建在系统调用之上。应用程序既可以使用共用函数库,也可以使用系统调用。shell是一个特殊的应用程序,为运行其他应用程序提供了一个接口。2. 登录UNIX操作系统用户在登录UNIX时,要输入登录名与密码(口令)。UNIX在口令文件/et

2021-10-20 10:44:20 464 5

原创 SQL学习笔记(4)

1. 约束 CONSTRAINT1.1 什么是约束在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性。1.2 约束包括哪些非空约束:not null唯一性约束:unique主键约束:primary key外键约束:foreign key1.3 非空约束 not null约束的字段不能为NULLdrop table if exists t_vip;create table t_vip( id int, name varchar(255

2021-10-19 11:13:38 342

原创 SQL学习笔记(3)

1. 插入数据 INSERT INTO1.1 插入完整的行INSERT INTO customersVALUES(100, 'Tony', 'USA', NULL, NULL);这个例子将一个新的顾客插入到customers表中。存储到表中的每一列数据由VALUES给出,必须给每一列提供一个值。如果某列没有值,就要用NULL(假定该列允许空值NULL)。各列必须以他们在表中定义的顺序填充。上面的方式有个缺点:过于依赖列的顺序,因此可以使用以下形式

2021-10-17 21:22:30 106

原创 SQL学习笔记(2)

1. 数据处理函数对于数据处理函数,每一个DBMS都有特定的函数,因此用到数据处理函数的SQL语句不易于移植。1.1 常用的文本处理函数LEFT截取字符串左边部分LEFT(要截取的字段,截取长度)SELECT LEFT(username,3) FROM user;RIGHT截取字符串右边部分RIGHT(要截取的字段,截取长度)SELECT RIGHT(username,3) FROM user;LENGTH返回字符串长度LENGTH(字符串)SELECT LENGTH(

2021-10-16 23:37:11 126

原创 SQL学习笔记(1)

1. 登录mysql$ mysql -u root -p root2. 显示所有数据库SHOW DATABASES;3. 创建数据库CREATE DATABASE test_db; -- 创建数据库test_db4. 使用数据库USE test_db;5. 显示数据库中所有的表tableSHOW TABLES;6. 数据库的行和列6.1 列表是由一个或多个列组成的。每个列都有相应的数据类型。6.2 行表中的一条记录。行=记录7. 主键表中每一行都应该有一列(或

2021-10-15 09:46:54 158

原创 Linux进程通信 系统调用总结

1. 进程通信概述Linux下进程通信的八种方法:匿名管道(pipe),命名管道(FIFO),内存映射(mapped memeory),消息队列(message queue),共享内存(shared memory),信号量(semaphore),信号(signal)套接字(Socket)2. 匿名管道(pipe)匿名管道用于进程之间通信,且仅限于本地父子进程之间通信,结构简单只提供单向通信,也就是说,两个进程都能访问这个文件,假设进程1往文件内写

2021-08-29 23:15:23 654 1

原创 Linux shell基本

以#!/bin/bash开头:指定解析器以.sh作为shell脚本文件后缀test0.sh#!/bin/bashecho "hello world"执行脚本: % sh test0.sh # 通过sh解析器执行脚本,所以脚本本身不需要执行权限hello world % ./test0.sh # 脚本自己执行,所以需要执行权限hello world1. 变量1.1 常用系统变量$HOME:家目录$PWD:当前目录$SHELL:默认shell解析器$U..

2021-08-14 23:01:43 75

原创 C语言 字符串函数

部分转载自本文概括了常用的C语言字符串库函数#include <string.h>1. strlen函数计算字符串长度并返回,字符串长度不包括终止字符'\0'。size_t strlen(const char * str)2. strcpy函数将src指向的字符串(包括终止字符’\0’),复制到dest指向的缓冲区。并返回dest要保证dest缓冲区足够大能够容纳src指向的字符串。注意dest和src所指内存区域不能重叠char * strcpy(char * dest

2021-06-27 17:17:42 142

原创 Linux 信号

对Linux信号进行了简单总结涉及signalkillraise参考资料1. 信号概念1.1 什么是信号信号即为软中断,用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。1.2 Linux处理信号方式当一个信号到来的时候收到这个信号的进程会根据信号的具体情况提供一下三种不同的处理方式:对于需要处理的信号,指定处理函数,由

2021-06-26 23:40:14 90

原创 Linux sleep exit abort函数

总结了Linux中经常用到的sleep和exit函数涉及sleepkill命令exit _exit _Exitatexittmpfileexit部分是转载内容1. Linux sleep库函数#include <unistd.h>使调用sleep函数的线程休眠seconds秒。如果中间有一个未被忽略的信号到达则终止休眠,如果该程序没有终止(比如对于某个信号定义了信号处理程序)从sleep函数后面的语句继续执行。返回剩余的休眠秒数。即如果请求的休眠时间已经过去则返回0,如果中

2021-06-25 13:08:06 453

原创 C语言 内存相关函数

整理了C语言中与内存操作相关的函数,以后就不怕忘了涉及mallocfreecallocreallocmemsetmemcpymemmovememcmp1. malloc函数#include <stdlib.h>动态内存分配函数。在内存的堆区中申请一块连续的指定大小(size个字节)的内存区域,并返回一个指向它的void*指针。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的void *malloc(size_t size)示例:int * p = (i

2021-06-24 22:04:54 259

原创 Linux I/O库函数(二)

对《Unix/Linux系统编程》关于IO库函数的整理涉及了fseek ftell rewindfeof ferr filenofdopenfreopenpopensetvbuf fflush setbuf1. I/O库函数1.1 文件读写指针1.1.1 fseek函数与lseek系统调用对应,移动文件读写指针int fseek(FILE *stream, long off, int whence)stream – 文件流offset – 这是相对 whence 的偏移量,以

2021-06-24 20:04:43 133

原创 Linux 基本I/O库函数

根据《Unix/Linux系统编程》中关于IO库函数部分内容进行总结包括系统调用与IO库函数关系,基本IO库函数fopenfclosefgetc getchar getcfputc putchar putcfgets getsfputs putsfscanf scanf sscanffprintf printf sprintffreadfwrite1. Linux中的系统调用与I/O库函数系统调用是文件操作基础,但是系统调用只支持数

2021-06-24 17:37:21 437

原创 Linux 使用系统调用进行文件读写

总结《Unix/Linux系统编程》中关于使用系统调用进行文件读写的部分涉及opendir、readdir、readlink、open、close、read、write、lseek系统调用1. 打开,读取目录文件目录也是一个文件,但是与普通文件不同,目录文件通过opendir和readdir库函数进行打开与读取1.1 opendir库函数根据目录名打开目录文件,返回一个指向该目录流的指针,该流被定位在目录的第一个条目上。目录中的每一个条目都指向该目录中的一个文件,目录中还有两个特殊的目录条目即".

2021-06-20 17:01:59 1778 1

原创 Linux inode 软硬链接 stat系统调用

对《Unix/Linux》系统编程中关于inode文件索引节点,软硬链接,stat系统调用进行了总结其中关于inode部分内容转载自网络链接参考资料1. 系统调用在Linux操作系统中,进程以两种模式运行:内核模式和用户模式。在用户模式中进程的权限非常有限,不能执行任何需要特殊权限的操作,而这些需要特殊权限的操作只能在内核模式中执行。系统调用使得进程能够进入内核模式执行用户模式下不能执行的操作,如复刻子进程,修改执行映像,打开文件等操作。系统调用必须由程序发出,用法与普通函数一样。每个系统调用函数

2021-06-20 12:55:42 637

原创 Linux 定时器 setitimer

阅读了《Unix/Linux系统编程》中关于定时器及时钟服务的部分,结合网上资料进行了整理1. 相关概念基于X86架构的个人计算机有数个定时器,包括实时时钟RTC、可编程间隔定时器PIT、多核CPU中的本地定时器、高分辨率定时器。实时时钟RTC:RTC由一个小型备用电池供电,即使计算机关机时,它也能够连续运行。RTC用于实时提供时间和日期信息。由于RTC在电脑关机时继续运行,因此可以解释为什么开机后系统显示的时间与现实中保持一致。时间变量是一个长整数,即从1970年1月1日起经过的秒数。2. 时钟相

2021-06-19 14:11:13 1310

原创 Linux 多线程 信号量 屏障

阅读了《Unix/Linux系统编程》中关于Pthread信号量和屏障的内容,结合网上资料进行了整理参考资料6. 信号量信号量是进程同步的一种机制。它是一种特殊的变量,它可以被增加或减少,但对信号量的访问被保证是原子操作。在POSIX中,信号量是sem_t类型。可以对信号量进行P/V操作,POSIX中的信号量中有一个计数值,P操作对信号量-1,V操作对信号量+1。需要inculude<semaphore.h>6.1 信号量初始化int sem_init(sem_t * sem, i

2021-06-18 21:55:30 396

原创 Linux Pthread 条件变量

阅读了《Unix/Linux系统编程》一书中关于Pthread中的条件变量相关内容,进行了整理总结本文包含了临界区、条件变量等内容,并关于pthread_cond_wait放在while还是if中通过示例进行了具体分析参考资料5. 条件变量条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等待另一个线程发送信号来弥补互斥锁的不足,即提供了一种线程协作的方

2021-06-17 22:49:19 242

原创 Linux 多线程 Pthread 互斥量

阅读了《Unix/Linux系统编程》中关于Pthread的内容,并查阅相关资料,进行了总结本文介绍了Pthread多线程基本操作与互斥量基本操作1. POSIX和Pthread线程概念1.1 POSIX:POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准。一般情况下,应用程序通过应用编程接口(API)而不是直接通过系统调用来编程(即并不需要和内核

2021-06-17 22:45:30 552

原创 C/C++中的 void*

在看《Unix/Linux系统编程》中关于POSIX Thread部分的时候发现C语言中用void*传递了int类型变量,很疑惑,于是差了些资料并汇总了一下。介绍了C语言和C++中关于void*的用法,涉及到了C++中的reinterpret_cast如果哪里有错误欢迎指正!参考资料参考资料1. C/C++中的void*与其他指针类型转换1.1 C中void*与其他指针类型转换C语言对指针类型的转换要求很低。但是这将留下一个很大的漏洞int* a=NULL; void* b=NULL;

2021-06-17 15:30:43 1771 1

原创 Linux errno错误码 man命令

1. 错误码/errnoLinux中系统调用和某些库函数的错误(比如系统调用函数返回-1)都存储于 errno中,errno由操作系统维护,存储最近一次发生的错误,即下一次的错误码会覆盖掉上一次的错误。errno是一个int类型全局变量,在errno.h中定义。当linux系统调用出错时,一般会将errno变量(需include <errno.h>)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因。errno值为0代表成功。errno错误码经常与strerror函数配合使

2021-06-16 22:55:03 802

空空如也

空空如也

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

TA关注的人

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