- 博客(74)
- 收藏
- 关注
原创 MySQL——在ubuntu环境下安装MySQL
配置文件在/etc/mysql/mysql.conf.d/mysqld.cnf,数据在/var/lib/mysql。若在Ubuntu下忘记了密码,可以修改/etc/mysql/mysql.conf.d/mysql.cnf。如果你的 Ubuntu 是 22.04 及以上,系统默认源里就有 MySQL 8.0/8.4,Ubuntu中MySQL的服务名通常叫mysql(不像CentOS叫mysqld)Ubuntu(MySQL 8.0+):默认使用auth_socket插件,且只允许系统root身份登录。
2026-10-30 22:06:15
420
37
原创 Linux系统——线程概念与控制之理解线程和线程控制
●在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”●一切进程至少都有一个执行线程●线程在进程内部运行,本质是在进程地址空间内运行●在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化●透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流不过,要真正理解线程,就必须搞清楚内核是如何进行资源划分的,尤其是代码。
2026-10-30 22:05:31
144
40
原创 Linux系统——进程信号
●main函数调用insert函数向一个链表head中插入节点node1,插入操作分为两步,刚做完第一步的时候,因为硬件中断使进程切换到内核,再次回到用户态之前检查到有信号待处理,于是切换到sighandler函数,sighandler也调用insert函数向同一个链表head中插入节点node2,插入操作的两步都做完之后从sighandler返回内核态,再次回到用户态就从main函数调用的insert函数中继续往下执行,先做完第一步之后被打断,现在继续做完第二步。此时可以用volatile解决。
2026-10-27 18:15:29
561
57
原创 Linux系统——进程信号之保存和捕捉信号
●将sa_handler赋值为常数SIG_IGN传给sigaction表示忽略信号,赋值为常数SIG_DFL表示执行系统默认动作,赋值为一个函数指针表示用自定义函数捕捉信号,或者说向内核注册了一个信号处理函数,该函数返回值为void,可以带一个int函数,通过参数可以得知当前信号的编号,这样就可以用同一个函数处理多种信号。集,这个类型可以表示每个信号的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有效”和“无效”的含义是该信号是否处于未决状态。
2026-10-27 18:15:03
430
68
原创 Linux系统——进程信号之信号的产生
如:某人睡觉,设定了一个30分钟之后的闹钟,20分钟后被人吵醒,还想多睡一会,于是重新设定闹钟为15分钟后响,“以前设定的闹钟时间还余下的时间”是10分钟。除零异常后,我们并没有清理内存,关闭进程打开的文件,切换进程等操作,所以CPU中还保留上下文数据以及寄存器内容除零异常会一直存在,就有了所看到的一直发出异常信号的现象。所以,信号的处理方法,在信号产生之前,就已经准备好了。●按下Ctrl+c,进程没有退出,这是因为我们调用的signal函数,改变了2号信号的处理方式,转而使用我们自定义的处理方式。
2026-10-23 14:01:05
389
65
原创 Linux系统——进程间通信之system V
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,即进程不再通过执行进入内核的系统调用来传递彼此的数据。
2026-10-23 14:00:26
813
71
原创 Linux系统——进程间通信之管道
●数据传输:一个进程需要将它的数据发送给另一个进程●资源共享:多个进程间共享同样的资源●通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)●进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
2026-10-16 21:15:45
1337
111
原创 Linux系统——库的原理与制作之操作
h或--file-header:显示ELF文件的文件头信息。文件头包括ELF文件的基本信息,如文件类型、机器类型、版本、入口点地址、程序头表、程序头表和节头表的位置和大小等Flags: 0x0// 内核中关于ELF Header相关的数据结构// 没错,操作系统⾃⼰必须能够识别特定格式的可执⾏程序:/linux/include/elf.h。
2026-10-16 21:15:01
1317
119
原创 Linux系统——库的原理与制作之ELF文件的形成与加载的过程(下)
读取可执行程序最终的所有的section清单#main.o和code.o的.text被合并了,是main.exe的第13个section#如何证明上面的说法?#关于main.o或code.o call后面的00 00 00 00 有没有被修改成为具体的最终函数地址?
2026-10-12 22:11:36
1160
100
原创 Linux系统——库的原理与制作之ELF文件的形成与加载的过程(上)
要理解编译链链接的细节,就必须了解ELF文件。以下四种文件都是ELF文件:●可重定位文件(Relocatable File):即xxx.o文件。
2026-10-12 22:11:06
1093
107
原创 Linux系统——库的原理与制作之制作和使用动静态库
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从0开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:●静态库 .a[Linux]、.lib[Windows]●动态库 .so[Linux]、.dll[Windows]// ubuntu 动静态库// C//C++// Centos 动静态库// C// C++封装libc代码,在任意位置新增“库文件”24。
2026-10-09 17:03:49
360
108
原创 Linux系统——文件(下)
可以知道,真正找到磁盘上文件的并不是文件名,而是inode。起始在linux中可以让多个文件名对应同一个inode。total 20●test和hard的链接状态完全相同,它们被称为指向文件的硬链接。内核记录了这个连接数,inode 656163的硬链接数为2●在删除文件时干了两件事:1.在目录中将对应的记录删除 2.将硬链接数-1,若为0,则将对应的磁盘释放。
2026-10-09 17:02:32
846
117
原创 Linux系统——文件(上)
在Linux系统中,最常见的是ext2系列的文件系统。其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会一个一个扇区读取的,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。所以,寻址一个扇区:先找到哪一个柱面(Cylinder),在确定柱面内哪一个磁道(其实就是磁头位置,Head),在确定扇区(Sector),所以就有了CHS。柱面(cylinder),磁头(head),扇区(sector),可以定位数据,这就是数据定位(寻址)方法之一,CHS寻址方式。
2026-09-27 21:17:01
1548
112
原创 Linux系统——基础IO(下)
缓冲区是内存空间的一部分。即在内存空间预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
2026-09-27 21:16:38
827
118
原创 Linux系统——基础IO(上)
pathname: 要打开或创建的⽬标⽂件flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定⼀个且只能指定⼀个O_CREAT : 若⽂件不存在,则创建它。需要使⽤mode选项,来指明新⽂件的访问权限O_APPEND: 追加写返回值:成功:新打开的⽂件描述符失败:-1。
2026-09-15 13:40:07
1056
102
原创 Linux系统——进程控制(下)
exec/exit就像call/return一个C程序有很多函数组成。一个函数可以调换导另一个函数,同时传递给它一些参数。被调用的函数执行一定的操作,然后返回一个值。每个函数都有它的局部变量,不同的函数通过call/return系统进行通信。这种通过参数和返回值在拥有私有数据的函数间通信的模式是结构化程序设计的基础。Linux鼓励将这种应用于程序之内的模式扩展到程序之间。如下图:一个C程序可以fork/exec另一个程序,并传递给它一些参数。
2026-09-15 13:39:24
405
114
原创 Linux系统--进程控制(上)
●若子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获取子进程退出信息。所以,fork之前父进程独立执行,fork之后,父子两个执行流分别执行。●另外,进程一旦变成僵尸状态,就刀枪不入,就算是kill -9也无能为力,因为谁也没有办法杀死一个已经死去的进程。通常,父子代码共享,若父子不写入,则数据也是共享的,当任意一方试图写入,就会以写时拷贝的方式各自一份副本。●由于子进程退出,父进程若不管不顾,就可能照成“僵尸进程”的问题,进而造成内存泄露的问题。
2026-09-09 15:53:14
620
97
原创 Linux系统——进程概念(下)
▨编译完成后的程序是存放再硬盘上的,当运行的时候,需将程序般到内存当中去运行,若直接使用物理地址的话,我们无法确定内存现在使用到哪里了,即拷贝的实际内存地址每一个运行都是不确定的,如:第一次执行a.out的时候,内存当中一个进程都没有运行,所以搬迁到内存地址是0x00000000,但第二次的时候,内存已经有10个进程再运行,那执行a.out的时候,内存地址就不一定了。早期计算中,要运行一个程序,会将这些程序全部装入内存,程序都是直接运行在内存上的,即程序中访问的内存地址都是实际的物理内存地址。
2026-09-09 15:52:49
868
114
原创 Linux系统——进程概念(上)
在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,称之为进程调度O(1)算法代码块/**/#endif/**/#endif#endif/**/
2026-08-15 20:41:00
1028
106
原创 Linux——基础开发工具(下)
到了2005年,开发BitKeeper的商业公司同Linux内核开源社区的合作关系结束,他们回收了Linux内核社区免费使用BitKeeper的权力。版本控制器就是能让我们了解到一个文件的历史,以及它的发展过程的系统。●程序的发布方式有两种,debug模式和release模式,Linux gcc/g++出来的二进制程序,默认是release模式。若监视的表达式在程序运行期间的值发生变化,GDB会暂停程序的执行,并通知使用者。最后的"XXX"表示改动的备注信息,提交的时候应注明提交日志,描述改动的详细内容。
2026-08-15 20:40:44
1576
123
原创 Linux——基础开发工具(上)
●在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。●但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装。●软件包和软件包管理器,就好比“APP”和“应用商店”的关系。●yum(Yellow dog Updater,Modified)是Linux下非常常用的一种包管理器。
2026-07-28 17:30:44
2107
113
原创 Linux——基础指令(下)
●目录的可执行权限是表示你可否在目录下执行命令●若目录没有-x权限,则无法对目录执行任何命令,甚至无法cd进入目录,即使目录仍然有-r读权限●而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限●所有在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
2026-07-28 17:28:57
3960
113
原创 Linux——基础指令(中)
使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不断刷新,使你看到最新的文件内容。,操作windows不是直接操作windows内核,而是通过图形接口,点击,从而完成相应的操作(如进入D盘的操作,通常是双击D盘盘符,运行应用程序也可以如此)。在预设情况下,可以将压缩档任何地方解开。●-a或-all详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。
2026-07-15 17:43:57
1913
111
原创 Linux——基础指令(上)
据权威部门统计,目前Linux在服务器领域已经占据75%的市场份额,同时,Linux在服务器市场的迅速崛起,已经引起全球IT产业的高度关注,并以强劲的势头成为服务器操作系统领域中的中坚力量。随着Linux操作系统飞速发展,各种集成在Linux上的开源软件和实用工具也得到了应用和普及,因此,Linux也成为了开源软件的代名词。据Linux基金会的研究,86%的企业已经使用Linux操作系统进行云计算、大数据平台的构建,目前,Linux已开始取代Unix成为最受青睐的云计算、大数据平台操作系统。
2026-07-15 17:41:14
3786
134
原创 C++起始之路——C++11(下)
这也意味着lambda表达式若定义在全局位置,捕捉列表必须为空。●默认情况下,lambda捕捉列表是被const修饰的,也就是说传值捕捉的过来的对象不能修改,mutable加在参数列表后面可以取消其常量性,也就是说使用该修饰符后,传值捕捉的对象就可以修改了,但是修改还是形参对象,不会影响实参。使用该修饰符后,参数列表不可省略(即使参数为空)。
2026-05-16 20:13:38
1123
95
原创 递归、搜索与回溯——综合(上)
1.定义行、列、九宫格标记数组以及找到可行方法的标记方法,将它们初始化为false。2.定义一个数组来存储每个需要处理的位置。3.将题目给出的所有元素的行、列以及九宫格坐标标记为true。4.将所有需要处理的位置存入数组。
2026-05-09 21:39:32
863
142
原创 C++起始之路——哈希表的实现
若是2^x,那么key%2^x本质相当于保留key的后x位,那么后x位相同的值,计算出的哈希值都是一样的,就冲突了。当key是string/Date等类型是,key不能取模,那么需要给HashTable增加一个仿函数,这个仿函数支持把key转换成一个可以取模的整型,若key可以转换为整型并且不容易冲突,那么这个仿函数就用默认参数即可,若这个key不能转换成整型,就需要自己实现一个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每个值都参与到计算中,让不同的key转换出的整型值不同。
2026-04-25 18:16:40
1381
91
原创 C++起始之路——unordered_map和unordered_set的使用
●unordered_map和map的第二个差异是迭代器的差异,map的iterator是双向迭代器,unordered_map是单向迭代器,其次map底层是红黑树,红黑树是二叉搜索树,走中序遍历是有序的,所以map迭代器遍历是Key有序+去重。●unordered_set和set的第二个差异是迭代器的差异,set的iterator是双向迭代器,unordered_set是单向迭代器,其次set底层是红黑树,红黑树是二叉搜索树,走中序遍历是有序的,所以set迭代器是有序+去重;
2026-04-22 19:12:21
1065
73
原创 C++起始之路——封装红黑树实现map和set
●end()如何表示?如下图:当it指向50时,++it时,50是40的右,40是30的右,30是18的右,18到根没有父亲,没有找到孩子是父亲左的那个祖先,这是父亲为空了,那我们就把it中的节点指针置为nullptr,用nullptr去充当end。尤其是set,两个模板参数是一样的。●若当前节点是父亲的右,根据中序左子树->根节点->右子树,当前节点所在的子树访问完了,当前节点所在父亲的子树也访问完了,那么下一个访问的需要继续往根的祖先中去找,直到找到孩子是父亲左的那个祖先就是中序要访问的下一个节点。
2026-04-22 19:11:54
1340
80
原创 递归、搜索与回溯——回溯
回溯算法是一种经典的递归算法,通常用于解决组合问题、排列问题和搜索问题等。回溯算法的基本思想:从一个初始状态开始,按照一定的规则向前搜索,当搜索到某个状态无法前进时,回退到前一个状态,再按照其他的规则搜索。回溯算法在搜索过程中维护一个状态树,通过遍历状态树来实现对所有可能解的搜索。回溯算法的核心思想:“试错”,即在搜索过程中不断地做出选择,若选择正确,则继续向前搜索;否则,回退到上一个状态,重新作出选择。回溯算法通常用于解决具有多个解,且每个解都需要搜索才能找到的问题。
2026-04-19 15:29:50
696
73
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅