linux并发服务器 —— 文件IO相关函数(三)
文件IO
以内存为主体,看待输入输出;
标准C库IO函数带有缓冲区,效率较高;
虚拟地址空间
虚拟地址空间是不存在的,一个应用程序运行期间对应一个虚拟地址空间;
虚拟地址空间的大小由CPU决定,位数不同,大小不同;
32位的机器,虚拟地址空间如下所示:
虚拟空间会被逻辑管理单元MMU映射到真实的物理内存;
调用linux系统API(系统调用)对内核区进行操作;
文件描述符
位于进程的内核区,由PCB管理,用于定位文件,通过其实现对文件的操作;
PCB中通过数组管理文件描述符,最大为1024,前三个为0-标准输入、1-标准输出、2-标准错误,默认打开;
标准输入、标准输出、标准错位指向当前同一终端(设备文件);
不同的文件描述符对应不同的文件,一个文件可以被打开多次,多次打开的文件描述符不同;
文件描述符的分配,去文件描述符表中找最小的没有分配的文件描述符进行分配即可;
Linux系统的IO函数
open打开文件
/*#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>// flags标记 宏定义在前两个头文件// 打开一个已经存在的文件int open(const char *pathname, int flags); 参数:pathname - 文件路径flags - 对文件的操作权限设置和其他设置只读、只写、读写 设置互斥( O_RDONLY, O_WRONLY, or O_RDWR)返回值:返回文件描述符,调用失败返回-1errno:属于Linux系统函数库,库里的全局变量,记录最近的错误号可以通过perror打印errno对应的错误描述// 创建一个新的文件int open(const char *pathname, int flags, mode_t mode);
*/#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(){int fd = open("a.txt" , O_RDONLY);if(fd==-1){perror("open");}// 关闭文件描述符 使其不指向任何文件close(fd);return 0;
}
open创建新文件
/*#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags, mode_t mode);新参数:flags - 操作权限和其他设置;必选项:操作权限;可选项:O_CREATE 文件不存在创建新文件int类型 32位 每一位都是一个标志位mode - 8进制的数,表示用户对创建出新的文件的操作权限最终权限:mode&~umask(不同用户umask不同,可以改)eg. 0777 - 最高权限 0777&~0002->0775
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(){//创建新的文件int fd = open("create.txt" , O_RDWR|O_CREAT , 0777);if(fd==-1){perror("open");}close(fd);return 0;
}
read、write函数
/*#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);参数:fd - 文件描述符 open得到 通过文件描述符操作文件buf - 读取数据存放的地方 数组的地址count - 指定数组大小返回值成功 >0 实际读取字节数=0 文件读取完了失败-1 并设置errnossize_t write(int fd, const void *buf, size_t count);参数:buf - 往磁盘写入的数据count - 要写的数据实际大小
*/#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(){// 1. open开int sfd = open("english.txt" , O_RDONLY);if(sfd==-1){perror("open");return -1;}// 2. 创建新的文件int dfd = open("cpy.txt" , O_WRONLY | O_CREAT , 0664);if(dfd==-1){perror("open");return -1;}// 3. 读写char buf[1024] = {0};int len = 0;while((len = read(sfd, buf, sizeof(buf)))>0){write(dfd , buf , len);}// 4. 关闭文件close(dfd);close(sfd);return 0;
}
lseek函数
/*#include <sys/types.h>#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);参数:fd - 文件描述符offset - 偏移量whence - 指定标记:SEEK_SET设置文件指针偏移量SEEK_CUR从当前位置设置偏移量SEEK_END从文件结尾设置偏移量返回值:文件指针的位置作用:1. 移动文件指针到头文件lseek(fd , 0 , SEEK_SET);2. 获取当前文件指针位置lseek(fd , 0 , SEEK_CUR);3. 获取文件长度lseek(fd , 0 , SEEK_END);4. 拓展文件长度 10b->110blseek(fd , 100 , SEEK_END);
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>int main(){int fd = open("hello.txt" , O_RDWR);if(fd == -1){perror("open");return -1;}// 扩展文件长度int cnt = lseek(fd , 100 , SEEK_END);if(cnt == -1){perror("lseek");return -1;}// 写入空数据write(fd , " " , 1);close(fd);return 0;
}
stat、lstat函数
/*#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int stat(const char *pathname, struct stat *statbuf);作用:获取文件相关信息参数:pathname - 操作文件路径statbuf - 结构体变量(传出参数) 用于保存获取到的文件信息返回值:成功 - 0失败 - -1 设置errnoint lstat(const char *pathname, struct stat *statbuf);参数:pathname - 操作文件路径statbuf - 结构体变量(传出参数) 用于保存获取到的文件信息返回值:成功 - 0失败 - -1 设置errno
*/
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>int main(){struct stat statbuf;int cnt = stat("a.txt" , &statbuf);if(cnt==-1){perror("stat");return -1;}printf("size: %ld\n" , statbuf.st_size);return 0;
}
stat和lstat的区别在于软链接情况;stat通过软链接查源头文件,lstat不会;
模拟实现ls -l命令
列出当前目录下的文件信息;
// 模拟实现 ls-l指令
// -rw-rw-r-- 1 nowcoder nowcoder 10 8月 28 11:02 a.txt#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <string.h>// argc>=1 - 文件名称
int main(int argc , char* argv[]){// 判断输入参数的正确性if(argc<2){printf("%s filename\n" , argv[0]);return -1;}// 通过stat获取传入文件信息struct stat st;int cnt = stat(argv[1] , &st);if(cnt == -1){perror("stat");return -1;}// 获取文件类型和文件权限char perms[11] = {0}; // 用于保存文件类型和文件权限// 文件类型switch(st.st_mode & __S_IFMT){case __S_IFLNK:perms[0] = 'l';break;case __S_IFDIR:perms[0] = 'd';break;case __S_IFREG:perms[0] = '-';break;case __S_IFBLK:perms[0] = 'b';break;case __S_IFCHR:perms[0] = 'c';break;case __S_IFSOCK:perms[0] = 's';break;case __S_IFIFO:perms[0] = 'p';break;default:perms[0] = '?';break;}// 文件访问权限// 文件所有者perms[1] = (st.st_mode & S_IRUSR)?'r':'-';perms[2] = (st.st_mode & S_IWUSR)?'w':'-';perms[3] = (st.st_mode & S_IXUSR)?'x':'-';// 文件所在组perms[4] = (st.st_mode & S_IRGRP)?'r':'-';perms[5] = (st.st_mode & S_IWGRP)?'w':'-';perms[6] = (st.st_mode & S_IXGRP)?'x':'-';// OTHERSperms[7] = (st.st_mode & S_IROTH)?'r':'-';perms[8] = (st.st_mode & S_IWOTH)?'w':'-';perms[9] = (st.st_mode & S_IXOTH)?'x':'-';// 硬连接数int ln = st.st_nlink;// 文件所有者char* ur = getpwuid(st.st_uid)->pw_name;// 文件所在组char* grp = getgrgid(st.st_gid)->gr_name;// 文件大小long int filesize = st.st_size;// 获取修改时间char* time = ctime(&st.st_mtime);char mtime[512] = {0};strncpy(mtime , time , strlen(time) - 1);char buf[1024];printf("%s\n" , argv[0]);sprintf(buf , "%s %d %s %s %ld %s %s" , perms , ln , ur , grp , filesize , mtime , argv[1]);printf("%s\n" , buf);return 0;
}
文件属性操作函数
acess - 判断文件权限
/*#include <unistd.h>int access(const char *pathname, int mode);作用:判断文件是否由每个权限 或文件是否存在参数:pathname - 文件路径mode F_OK 文件是否存在R_OK 是否有读权限W_OK 是否有写权限X_OK 是否有执行权限返回值成功 - 0失败 - -1
*/#include <unistd.h>
#include <stdio.h>int main(){int ret = access("a.txt" , F_OK);if(ret == -1){perror("access");return -1;}printf("文件存在\n");return 0;
}
chmod - 修改文件权限
/*#include <sys/stat.h>int chmod(const char *pathname, mode_t mode);参数:mode - 需要修改的权限值 八进制rwx返回值:成功 - 0失败 - -1
*/
#include <sys/stat.h>
#include <stdio.h>
int main(){int ret = chmod("a.txt" , 0775);if(ret == -1){perror("chmod");return -1;}printf("修改成功\n");return 0;
}
chown - 修改文件所有者/所有组
//通过 vim /etc/group 查所属组 和 id
// id 用户名可查uid 和 gid
#include <unistd.h>int chown(const char *pathname, uid_t owner, gid_t group);
truncate - 缩减/扩展文件大小
/*#include <unistd.h>#include <sys/types.h>int truncate(const char *path, off_t length);作用:缩减/扩展文件至指定大小参数:path - 文件路径length - 指定最终文件大小返回值:成功 - 0失败 - -1
*/
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>int main(){int ret = truncate("b.txt" , 20);if(ret==-1){perror("truncate");return -1;}printf("修改文件大小成功");return 0;}
目录操作函数
mkdir
/*#include <sys/stat.h>#include <sys/types.h>int mkdir(const char *pathname, mode_t mode);作用:创建目录参数:pathname - 创建的目录路径mode - 权限 八进制返回值:成功 - 0失败 - -1
*/
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
int main(){int ret = mkdir("aaa" , 0777);if(ret == -1){perror("mkdir");return -1;}printf("创建目录成功\n");return 0;
}
rmdir - 只能删除空目录
rename - 文件的重命名
chdir - 修改当前工作目录
getcwd - 获取当前工作路径
/*#include <unistd.h>int chdir(const char *path);作用:修改进程的工作目录参数:path - 需要修改的工作目录#include <unistd.h>char *getcwd(char *buf, size_t size);作用:获取当前工作目录参数:buf - 存储路径,指向数组size - 数组大小返回值:指向的一块内存 这个数据就是第一个参数*/
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(){// 获取当前路径char buf[128];getcwd(buf , sizeof(buf));printf("当前工作目录:%s\n" , buf);// 改目录int ret = chdir("/home/nowcoder/linux/lesson13");if(ret == -1){perror("chdir");return -1;}printf("已切换目录\n");int fd = open("chdir.txt" , O_RDWR|O_CREAT , 0664);if(fd == -1){perror("open");return -1;}close(fd);char buf1[128];getcwd(buf1 , sizeof(buf1));printf("当前工作目录:%s\n" , buf1);return 0;
}
目录遍历函数
opendir
readdir
closedir
/*// 打开一个目录#include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name);参数:name - 打开目录名返回值:DIR* - 目录流信息错误返回NULL// 读取目录中的数据#include <dirent.h>struct dirent *readdir(DIR *dirp);参数:dirp - opendir返回的结果返回值:struct dirent * - 读取到的文件信息读到末尾/失败 返回NULL// 关闭目录#include <sys/types.h>#include <dirent.h>int closedir(DIR *dirp);参数:opendir的返回值*/
#define _DEFAULT_SOURCE
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int getnum(const char* path);
// 读某个目录下所有普通文件的个数
int main(int argc , char *argv[]){if(argc<2){printf("%s path\n" , argv[0]);return -1;}int num = getnum(argv[1]);printf("普通文件个数:%d\n" , num);return 0;
}// 用于获取目录下所有普通文件个数
int getnum(const char* path){// 1. 打开目录DIR* dir = opendir(path);if(dir == NULL){perror("opendir");return -1;}// 2. 读取struct dirent *ptr;// 普通文件个数int tol = 0;while((ptr = readdir(dir))!=NULL){// 获取名称char* dname = ptr->d_name;// 忽略. ..if(strcmp(dname,".")==0 || strcmp(dname,"..")==0){continue;}// 判断是否是普通文件if(ptr->d_type == DT_DIR){// 目录char newpath[256];sprintf(newpath , "%s/%s" , path , dname);tol += getnum(newpath);}if(ptr->d_type == DT_REG){// 普通文件tol++;}}closedir(dir);return tol;
}
dup、dup2函数
dup - 复制文件描述符
/*#include <unistd.h>int dup(int oldfd);作用:复制一个新的文件描述符(指向同一文件)int dup2(int oldfd, int newfd);*/
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>int main(){int fd = open("a.txt" , O_RDWR|O_CREAT , 0664);int fd1 = dup(fd);if(fd1 == -1){perror("dup");return -1;}printf("fd: %d , fd1: %d\n" , fd , fd1);close(fd);char* str = "hello";int ret = write(fd1 , str , strlen(str));if(ret == -1){perror("write");return -1;}close(fd1);return 0;
}
dup2 - 重定向文件描述符
/*#include <unistd.h>int dup2(int oldfd, int newfd);作用:重定向文件描述符 若newfd被使用 会先关闭在指若oldfd==newfd 不做任何操作
*/
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>int main(){int fd = open("1.txt" , O_RDWR|O_CREAT , 0664);if(fd == -1){perror("open");return -1;}int fd1 = open("2.txt" , O_RDWR|O_CREAT , 0664);if(fd1 == -1){perror("open");return -1;}printf("fd: %d , fd1: %d\n" , fd , fd1);int fd2 = dup2(fd , fd1);if(fd2 == -1){perror("open");return -1;}// 通过fd1写数据char* str = "hello";int len = write(fd1 , str , strlen(str));if(len == -1){perror("write");return -1;}printf("fd: %d , fd1: %d , fd2: %d\n" , fd , fd1 , fd2);close(fd);close(fd1);return 0;
}
fcntl函数
1. 复制文件描述符;2. 设置/获取文件状态标志
/*#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd, ... );参数:fd - 需要操作的文件描述符cmd - 对文件描述符的操作1. 复制文件描述符 F_DUPFD2. 获取指定文件描述符文件状态flag(同open) F_GETFL3. 设置指定文件描述符文件状态 F_SETFLO_APPEND 追加数据O_NOnBLOCK 设置成非阻塞
*/
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>int main(){// 复制文件描述符// int fd = open("1.txt" , O_RDONLY);// int ret = fcntl(fd , F_DUPFD);// 2. 修改/获取文件状态标志int fd = open("1.txt" , O_RDWR);if(fd == -1){perror("open");return -1;}// 获取flagint flag = fcntl(fd , F_GETFL);if(flag == -1){perror("fcntl");return -1;}flag |= O_APPEND;// 修改flagint ret = fcntl(fd , F_SETFL , flag);if(ret == -1){perror("fcntl");return -1;}char* str = "nihao";write(fd , str , strlen(str));close(fd);return 0;
}
Node: 一定要注意 如果一个文件的权限是只读 即使通过fcntl设置了O_APPEND还是不能往文件里写
相关文章:

linux并发服务器 —— 文件IO相关函数(三)
文件IO 以内存为主体,看待输入输出; 标准C库IO函数带有缓冲区,效率较高; 虚拟地址空间 虚拟地址空间是不存在的,一个应用程序运行期间对应一个虚拟地址空间; 虚拟地址空间的大小由CPU决定,位…...

matlab使用教程(27)—微分代数方程(DAE)求解
1.什么是微分代数方程? 微分代数方程是一类微分方程,其中一个或多个因变量导数未出现在方程中。方程中出现的未包含其导数的变量称为代数变量,代数变量的存在意味着您不能将这些方程记为显式形式 y ′ f t , y 。相反,您可以…...

vue3组合式api <script setup> props 父子组件的写法
父组件传入子组个的变量, 子组件是无法直接修改的, 只能通过 emit的方式, 让父组件修改, 之后子组件更新 <template><div class"parent">我是父组件<son :msg"msg" :obj"obj" chan…...

Compose - 自定义作用域限制函数
一、概念 在 Compose 中对于作用域的应用特别多。比如 weight 修饰符只能用在 RowScope 或者 ColumnScope 作用域中,item 组件只能用在 LazyListScope 作用域中。 标准库中的作用域函数如 apply()、let() 会以不同方式持有和返回上下文对象,调用它们时 L…...

【Flutter】Flutter 使用 photo_view 实现图片查看器
【Flutter】Flutter 使用 photo_view 实现图片查看器 文章目录 一、前言二、photo_view 简介三、安装与基本使用四、使用 PhotoViewGallery 展示多张图片五、完整示例六、总结 一、前言 大家好,我是小雨青年,今天我要给大家介绍一个在 Flutter 中非常实…...

电脑组装教程分享!
案例:如何自己组装电脑? 【看到身边的小伙伴组装一台自己的电脑,我也想试试。但是我对电脑并不是很熟悉,不太了解具体的电脑组装步骤,求一份详细的教程!】 电脑已经成为我们日常生活中不可或缺的一部分&a…...

【云原生之Docker实战】使用Docker部署flatnotes笔记工具
【云原生之Docker实战】使用Docker部署flatnotes笔记工具 一、flatnotes介绍1.1 flatnotes简介1.2 flatnotes特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载flatnotes…...

XSSchallenge1-20
test1 第一题直接在test插入XSS代码即可 test2 第二关对内容进行”“包裹 这里可以采用”>来绕过 test3 代码审计发现这里用了htmlspecialchars函数,这个函数对<>和’ “等进行了转义,这里可以用事件来绕过 test4 这里用了str_replace&a…...

centos 7的超详细安装教程
打开虚拟机,创建一个新电脑 我们选择经典,然后选择下一步 我们选择稍后安装,我们在后面进行改设备 因为centos系统是linux系统的一个版本,所有我们选择linux,版本选择centos 7 64位,然后就是点击下一步 这一…...

代码随想录算法训练营第五十二天 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组
代码随想录算法训练营第五十二天 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组 300.最长递增子序列674. 最长连续递增序列718. 最长重复子数组 300.最长递增子序列 题目链接 视频讲解 给你一个整数数组 nums ,找到其中最…...

计算机图形软件(三)6-6 小结
小结 这一章概括了图形软件系统的主要特点。某些软件系统,如 CAD 软件包和绘图程序,其为特定应用而设计。另外一些软件系统则提供可以在诸如 C的程序设计语言中使用的一个通用图形子程序库,用来为任何应用生成图片。 ISO和AN…...

Flink常用函数
1、比较函数 <> > > < < 注意:select nullnull; 返回为nullIS NULL 、 IS NOT NULL --非空判断value1 IS DISTINCT FROM value2、value1 IS NOT DISTINCT FROM value2、 --不同于value1 BETWEEN [ ASYMMETRIC | S OR 、AND、NOT boolean…...

stable diffusion实践操作-embedding(TEXTUAL INVERSION)
本文专门开一节写图生图相关的内容,在看之前,可以同步关注: stable diffusion实践操作 可以理解为提示词的集合,可以省略大量的提示词。后缀safetensors,大小几十kb 正文 1、功能 可以理解为提示词的集合࿰…...

代码随想录二刷day03
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣203. 移除链表元素二、力扣707. 设计链表三、力扣206. 反转链表 前言 一、力扣203. 移除链表元素 /*** Definition for singly-linked list.* public…...

初出茅庐的小李博客之STM32F103C8T6音乐控制器实战教程【1】
STM32F103C8T6音乐控制器实战教程[1] USB简单介绍: "USB"代表通用串行总线(Universal Serial Bus),是一种用于连接计算机及其外部设备的标准接口。USB接口允许各种设备(如打印机、存储设备、键盘、鼠标、摄…...

苍穹外卖01-项目概述、环境搭建
项目概述、环境搭建 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示: 管理端-外卖商家使用用户端-点餐用户使用当我们完成该项目的学习,可以培养以下能力: 1. 软件开发整体介绍 作为一名软…...

图床项目进度(二)——动态酷炫首页
前言: 前面的文章我不是说我简单copy了站友的一个登录页吗,我感觉还是太单调了,想加一个好看的背景。 但是我前端的水平哪里够啊,于是在网上找了找制作动态背景的插件。 效果如下图。 如何使用 这个插件是particles.js 安装…...

Java“魂牵”京东商品详情描述数据,京东商品详情API接口,京东API接口申请指南
要通过京东的API获取商品详情描述数据,您可以使用京东开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例,展示如何通过京东开放平台API获取商品详情: 首先,确保您已注册成为京东开放平台的开发者,并创…...

Flink SQL你用了吗?
分析&回答 Flink 1.1.0:第一次引入 SQL 模块,并且提供 TableAPI,当然,这时候的功能还非常有限。Flink 1.3.0:在 Streaming SQL 上支持了 Retractions,显著提高了 Streaming SQL 的易用性,使…...

【位运算】leetcode面试题:消失的两个数字
一.题目描述 消失的两个数字 二.思路分析 本题难度标签是困难,但实际上有了只出现一次的数字iii这道题的铺垫,本题的思路还是很容易想到的。 温馨提示:阅读本文前可以先查看我的【位运算】专栏的第一篇文章,其中包含位运算这类…...

Vue2 集成 CodeMirror 实现公式编辑、块状文本编辑,TAG标签功能
效果图 安装codemirror依赖 本示例为Vue2项目,安装低版本的依赖 npm i codemirror5.65.12 npm i vue-codemirror4.0.6 实现 实现代码如下,里边涉及到的变量和函数自行替换即可,没有其他复杂逻辑。 <template><div class"p…...

CCF-CSP 30次 第二题【矩阵运算】
计算机软件能力认证考试系统 #include<bits/stdc.h> using namespace std; const int N1e410; #define int long long int n,d; int q[N][22],k[22][N],v[N][22],w[N]; int ans1[N][22],ans2[N][22]; signed main() {scanf("%lld %lld",&n,&d);for(in…...

最大子数组和【贪心算法】
最大子数组和 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 class Solution {public int maxSubArray(int[] nums) {//记录最大结果&…...

linux并发服务器 —— Makefile与GDB调试(二)
Makefile Makefile:定义规则指定文件的编译顺序;类似shell脚本,执行操作系统命令 优点:自动化编译——通过make(解释Makefile文件中指令的命令)命令完全编译整个工程,提高软件开发效率&#x…...

Ansible学习笔记14
实现多台的分离实现: [rootlocalhost playbook]# cat example3.yaml --- - hosts: 192.168.17.105remote_user: roottasks:- name: create test1 directoryfile: path/test1/ statedirectory- hosts: 192.168.17.106remote_user: roottasks:- name: create test2 d…...

docker 安装 mysql 并挂载 配置文件和数据目录
1、宿主机创建挂载目录 sudo mkdir /path/mysql/data sudo mkdir /path/mysql/conf2、搜索镜像 docker search mysql拉取官方支持版本(OFFICIAL 为 ok的版本) docker pull mysql:latest3、以 mysql 作为基础镜像构建容器并挂载目录 docker run -d -p…...

代码随想录训练营 DP01
代码随想录训练营 DP01 509. 🌸斐波那契数🌸code 70. 🌸爬楼梯🌸code 746. 🌸使用最小花费爬楼梯🌸code 509. 🌸斐波那契数🌸 斐波那契数 (通常用 F(n) 表示)…...

github+hexo 博客搭建
文章目录 1.安装Node.js、Git和Hexo2.创建 GitHub 仓库并配置ssh3.初始化Hexo4.配置Hexo5.创建博客内容6.部署7.查看8.参考:9.选择主题: 环境:win11wsl 1.安装Node.js、Git和Hexo 打开终端安装以下软件 sudo apt update sudo apt-get insta…...

Spring Security bug记录:antMatchers找不到符号(已解决)
目录 Spring Security bug记录:antMatchers找不到符号(已解决)原因:解决:参考链接: Spring Security bug记录:antMatchers找不到符号(已解决) 原因: 新版本…...

kaggle新赛:谷歌AI模型运行时间预测赛题解析【数据挖掘】
赛题名称:Google - Fast or Slow? Predict AI Model Runtime 赛题链接:https://www.kaggle.com/competitions/predict-ai-model-runtime 赛题背景 Alice 是一名 AI 模型开发人员,但她的团队开发的一些模型运行速度非常慢。她最近发现了编…...