【Linux】 基础IO——文件(中)
文章目录
- 1. 文件描述符为什么从3开始使用?
- 2. 文件描述符本质理解
- 3. 如何理解Linux下的一切皆文件?
- 4. FILE是什么,谁提供?和内核的struct有关系么?
- 证明struct FILE结构体中存在文件描述符fd
- 5. 重定向的本质
- 输出重定向
- 输入重定向
- 追加重定向
- 重定向函数 ——dup2
- 6. 如何理解缓冲区?
1. 文件描述符为什么从3开始使用?
修改test.c文件内容
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
#define LOG "log.txt"
int main()
{ umask (0);//将权限掩码设置成0 int fd=open(LOG, O_RDONLY );//打开一个文件,若文件不存在则重新创建一个 if(fd==-1)//说明打开失败 { printf("fd:%d,errno:%d,errstring:%s\n",fd,errno,strerror(errno));//打印出错误信息 } else printf("fd :%d\n", fd); char buffer[1024]; ssize_t n= read(fd,buffer,sizeof(buffer)-1);//使用系统接口来进行IO的时候,一定要注意\0的问题 if(n>0)//成功了,实际读到了多少字节 { buffer[n]='\0'; printf("%s\n",buffer); } close(fd); //关闭文件 return 0;
}
运行可执行程序,发现文件描述符返回的是3
![](https://img-blog.csdnimg.cn/e7277f5d212e4a9d830e562aac599558.png)
但为啥是3,不是0 ,1,2
任何一个进程,在启动的时候,默认会打开当前进程的三个文件:
标准输入、标准输出、标准错误 ——本质都是文件
C语言:标准输入(stdin) 标准输出(stdout) 、标准错误(stderr) ——文件在系统层的表现
C++: 标准输入(cin) 标准输出(cout) 、标准错误(cerr) ——文件在系统层的表现,它是一个类
因为Linux下一切皆文件,所以向显示器打印,本质就是向文件中写入
标准输入—设备文件—>键盘文件
标准输出—设备文件—> 显示器文件
标准错误—设备文件—> 显示器文件
创建test.cc文件(cc后缀即cpp代码)
#include<iostream>
#include<cstdio>//写C++时,使用C++风格的C语言代码
int main()
{ //C语言 printf("hello printf->stdout\n");//向stdout进行输出 fprintf(stdout,"hello printf->stdout\n ");//将数据向stdout进行输出 fprintf(stderr,"helllo printf->stderr\n");//将数据向标准错误打印 //C++ std::cout<<"hello cout->cout"<<std::endl;//表示标准输出 std::cerr<<"hello cerr->cerr"<<std::endl;//向标准错误中打印数据 return 0;
}
![](https://img-blog.csdnimg.cn/34a62b40bfcd4e2193d9dd921aaa45a3.png)
![](https://img-blog.csdnimg.cn/d44eca10879b4a6bb70157d337f9babc.png)
输出重定向是将标准输出重定向,此时log.txt文件中只会存在标准输出的内容
所以标准输出和标准错误都会向显示器打印,但是其实是不一样的
0默认对应标准输入,1默认对应标准输出、2默认对应标准错误
修改myfile.c文件内容
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
#define LOG "log.txt"
int main()
{
int fd1=open(LOG,O_WRONLY |O_CREAT | O_TRUNC,0666);
int fd2=open(LOG,O_WRONLY |O_CREAT | O_TRUNC,0666);
int fd3=open(LOG,O_WRONLY |O_CREAT | O_TRUNC,0666);
int fd4=open(LOG,O_WRONLY |O_CREAT | O_TRUNC,0666);
int fd5=open(LOG,O_WRONLY |O_CREAT | O_TRUNC,0666);
int fd6=open(LOG,O_WRONLY |O_CREAT | O_TRUNC,0666);
printf("%d\n",fd1);
printf("%d\n",fd2);
printf("%d\n",fd3);
printf("%d\n",fd4);
printf("%d\n",fd5);
printf("%d\n",fd6); return 0;
}
![](https://img-blog.csdnimg.cn/859dd5dbbf5a4087bc474f1a1621e6b1.png)
运行可执行程序,发现 打印结果为 3 4 5 6 7 8
因为 标准输入、标准输出、标准错误分别占用了0 、1、2,所以只能从3开始
文件描述符(open对应的返回值)本质就是数组的下标
2. 文件描述符本质理解
启动代码时就会变成一个进程,该进程在内核中就必须有自己的数据结构 struct task_struct,
称之为当前进程所对应的进程描述符
打开文件时,操作系统会把文件加载到内存里,以供CPU通过进程的方式来访问对应的文件
任何一个进程,在启动的时候,默认会打开进程的三个文件,系统中一定会存在大量被打开的文件,这些文件一定会被操作系统管理起来,通过先描述,在组织,创建 struct file 结构体,该结构体一定包含文件属性等,每一次创建并打开文件时,都是在内核中创建一个struct file的结构体
目前认为只要找到file,就可以找到所有文件内容
为了维护一个进程和多个文件的映射关系,在内核中定义了数据结构struct files_struct,该结构体内部有一个数组struct file* fd [ ] ,是一个内容为struct file*的数组
当进程初始化时,会创建struct files_struct 结构体,通过结构体找到数组,只要有数组一定有下标
3. 如何理解Linux下的一切皆文件?
内存把数据写到显示器上,属于写入的过程,读取是从键盘中读取的,键盘输入后,操作系统把输入的数据回显到显示器上了,所以显示器只能负责打印
不同的硬件所对应的方法是完全不一样的,打开键盘时,操作系统内部会创建struct file对象
![](https://img-blog.csdnimg.cn/7c9131e938a54da8be8a67f14d9ab5ba.png)
将键盘的read方法和 write方法 保存到函数指针中
每一个设备也只需要把方法的地址放入函数指针中
在当前进程看来,所有的东西都是文件对象,要有数据放到缓冲区里,底层读写时只需要调用对应的方法,来完成对应的读写,不关心底层的差异化
操作系统也有自己的wirte和read,本质上是拷贝,将应用层的数据拷贝到缓冲区里,在调用底层不同设备的方法,所以看起来就是Linux下一切皆文件
4. FILE是什么,谁提供?和内核的struct有关系么?
操作系统层面,必须要访问fd,才能找到文件
任何语言层访问外设或者文件必须经历操作系统
FILE *fopen(const char *path, const char *mode);
FILE是一个结构体,FILE由C语言提供的
C语言动态库
C语言头文件
证明struct FILE结构体中存在文件描述符fd
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
#define LOG "log.txt"
int main()
{
printf("%d\n",stdin->_fileno);//fileno代表文件描述符
printf("%d\n",stdout->_fileno);
printf("%d\n",stderr->_fileno);
FILE*fp=fopen(LOG,"w");
printf("%d\n",fp->_fileno); return 0;
}
![](https://img-blog.csdnimg.cn/750172a3d38b4718af8a2cfb2664f696.png)
说明结构体struct FILE内部存在文件描述符
同时因为0 1 2 被占用了,所以我们自己写的文件描述符返回3
5. 重定向的本质
![](https://img-blog.csdnimg.cn/49b89cff7c9e4bb9b1f8de0b4d3e544a.png)
关闭文件描述符0后,发现从0开始可以被输出了
![](https://img-blog.csdnimg.cn/9c008a4dc8d546f3b74545732d76ac72.png)
![](https://img-blog.csdnimg.cn/93869a01d64f4f418ff396cfa9b2bc14.png)
关闭文件描述符0和2后,发现0和2都可以被使用了
![](https://img-blog.csdnimg.cn/5e98cf84a1534f4592119a2d0054bf98.png)
进程中,文件描述符的分配规则:在文件描述符表中,最小的,没有被使用的数组元素分配给新文件
输出重定向
![](https://img-blog.csdnimg.cn/05e01b2ee59640898d55fdfec9d4a36f.png)
![](https://img-blog.csdnimg.cn/7e3bc8cbd2a24812a9d5e2efee03f99e.png)
若不关闭文件描述符1,当前printf打印的结果显示到显示器上面
![](https://img-blog.csdnimg.cn/6ea3d9546bed495d9f818c5bd8ce8f98.png)
关闭文件描述符1,再打开新的文件log.txt
![](https://img-blog.csdnimg.cn/6912e858c3aa486e844b23a213321b92.png)
此时运行可执行程序没有显示出you can see me,打开新文件发现本来应该打印到显示器的内容,打印到log.txt中了
本来应该打印到显示器上的内容,打印到文件里 ,这种现象叫做重定向
在文件描述符表中,最小的,没有被使用的数组元素分配给新文件,所以把文件描述符1分配给了log.txt
1号下标里面的地址填成了log.txt文件的地址,上层printf打印它知道吗?
不知道,它也不关心,它只认文件描述符1
重定向的原理:在上层无法感知的情况下,在OS内部 ,更改进程内部对应的文件描述符表中,特定下标的指向
输入重定向
先在log.txt文件中输入内容 123 456
修改myfile.txt文件内容
![](https://img-blog.csdnimg.cn/a35ffc5539e141e2b74dde644b05909d.png)
关闭文件描述符0,所以scanf读取时会读取log.txt文件中的内容
![](https://img-blog.csdnimg.cn/94d7535c8f7f40fa929a0c837bdaffd1.png)
读取的内容与log.txt文件内容相同
本来要从键盘中读取,结果现在要在文件中读取,这叫做输入重定向
追加重定向
![](https://img-blog.csdnimg.cn/c02ebaf150154c04abc310b010185577.png)
关闭文件描述符1后,导致printf不会打印在显示器上,而是追加到log.txt文件中
![](https://img-blog.csdnimg.cn/f57df93755314466b202e8bddac89594.png)
运行可执行程序,无显示,都追加到log.txt文件中
重定向函数 ——dup2
输入 man dup2
查看
刚刚重定向时,需要先关闭文件描述符1,再打开文件
现在可以直接将文件打开,使用dup2重定向
输出重定向对应的文件描述符是1
打开myfile文件,假设其文件描述符是fd
newfd为oldfd的一份拷贝,最后只剩下oldfd
dup2(fd,1)
![](https://img-blog.csdnimg.cn/5e21b62e11744e9cb53f899936b86f53.png)
将3号描述符里面的内容拷贝到1里面,用3号内容覆盖1号内容,此时1号描述符就不再指向标准输出了,转而指向myfile文件,写入1的内容,就会写入文件中
![](https://img-blog.csdnimg.cn/57818649e0e5496abbf945e5861c4aa4.png)
把本来应该显示到标准输出的内容,显示到log.txt文件中
![](https://img-blog.csdnimg.cn/ae2ac8b4f71041a8bca8d86805db6c84.png)
此时printf打印内容显示到log.txt文件中
6. 如何理解缓冲区?
修改myfile.c文件的内容
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
#include<errno.h>
#include<string.h>
#define LOG "log.txt"
int main()
{ //C库
fprintf(stdout,"hello world\n");
//系统调用 const char*msg="hello write\n"; write(1,msg,strlen(msg)); fork();return 0;
}
![](https://img-blog.csdnimg.cn/6fa825ac2923409386a3986bdb457d29.png)
运行可执行程序只有两行信息,但是重定向到log.txt文件后,打印出三行信息,说明重复打印了
![](https://img-blog.csdnimg.cn/4cf33e3db3214b63a00458e6d76a24b5.png)
若将fork函数注释掉后,发现 两者显示结果相同\
![](https://img-blog.csdnimg.cn/7e961d3832f345c3bcaed72632f1cf1f.png)
struct FILE除了会封装fd之外,还会预留一部分输出缓冲区
当把字符串想写入stdout中时 ,struct FILE除了fd,还有一部分缓冲区
当我们想写的时候,并不是把数据拷贝到操作系统内部,而是把数据放到缓冲区当中
此时这个fprintf函数会直接返回
C库会结合一定的刷新策略,将缓冲区中的数据写入操作系统(write(FILE->fd,xxxx))
刷新策略:
1.无缓冲 (不提供缓冲)
2.行缓冲
如果碰到\n,就会把\n在内之前的内容刷新出来
3. 全缓冲
只有把缓冲区写满的时候,才会刷新缓冲区
显示器采用的刷新策略:行缓冲
普通文件采用的刷新策略:全缓冲
为什么要有缓冲区?
节省调用者的时间
系统调用也会花费时间
可能写了10次,如果每次调用fprintf传给操作系统 都要花费时间
但若都写入缓冲区中,统一传给操作系统 效率就变高了
write接口不论有没有重定向,都会正常打印,因为调用write是系统调用 没有缓冲区,直接调用就写给操作系统了
而使用fprintf ,数据会先写入缓冲区
当要打印到显示器中时 刷新策略:行缓冲
因为打印的内容都存在\n,在调用fork时,打印的内容已经在缓冲区中被刷新走了,刷新之后在fork就没有任何意义了
所以fork就什么也没干
当打印到普通文件时 刷新策略:全缓冲
使用 hello world 没办法把缓冲区写满,就无法刷新,父子两个进程都要刷新
刷新就要对缓冲区做清空,即对数据做修改,此时谁先刷新就先发生写时拷贝,所以最终就会打印两次相同数据
相关文章:
![](https://img-blog.csdnimg.cn/7e961d3832f345c3bcaed72632f1cf1f.png)
【Linux】 基础IO——文件(中)
文章目录1. 文件描述符为什么从3开始使用?2. 文件描述符本质理解3. 如何理解Linux下的一切皆文件?4. FILE是什么,谁提供?和内核的struct有关系么?证明struct FILE结构体中存在文件描述符fd5. 重定向的本质输出重定向输…...
![](https://img-blog.csdnimg.cn/f8b284a4e903400a9f74036e9221054b.jpeg#pic_center)
蓝桥杯刷题冲刺 | 倒计时13天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.母牛的故事2.魔板1.母牛的故事 题目 链接: [递归]母牛的故事 - C语言网 (dotcpp.c…...
![](https://img-blog.csdnimg.cn/14d3775af9f24646b18aaed4f56ff521.png)
MIPI D-PHYv2.5笔记(5) -- 不同的PHY配置方式
声明:作者是做嵌入式软件开发的,并非专业的硬件设计人员,笔记内容根据自己的经验和对协议的理解输出,肯定存在有些理解和翻译不到位的地方,有疑问请参考原始规范看 规范5.7章节列举了一些常见的PHY配置,但实…...
![](https://img-blog.csdnimg.cn/2861b8f07a834cb0ae54f8d1435f7bae.gif#pic_center)
【周末闲谈】文心一言,模仿还是超越?
个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 周末闲谈 ✨第一周 二进制VS三进制 文章目录周末闲谈前言一、背景环境二、文心一言?(_)?三、文心一言的优势?😗😗😗四、文心一…...
![](https://img-blog.csdnimg.cn/img_convert/52c8fd60de910fd885651d65c6231b84.jpeg)
《一“企”谈》 | 「佛山市政」:携手企企通,让采购业务数智化
近日,国家施工总承包壹级企业「佛山市市政建设工程有限公司」(以下简称“佛山市政”)正积极布局数字化建设工作,基于采购业务数智化,携手企企通打造了SaaS采购云平台。 01、岭南建筑强企 匠心铸造精品 …...
![](https://img-blog.csdnimg.cn/dc9927dff61c49a880516d8893676a77.png)
Spark运行架构
目录 1 运行架构 2 核心组件 2.1 Driver 2.2 Executor 2.3 Master & Worker 2.4 ApplicationMaster 3 核心概念 3.1 Executor 与 Core 3.2 并行度( Parallelism) 3.3 有向无环图( DAG) 4 提交流程 …...
![](https://img-blog.csdnimg.cn/a5de880907954b1fa54450852b8c2495.jpeg#pic_center)
基于卷积神经网络CNN的水果分类预测,卷积神经网络水果等级识别
目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络CNN水果分类预测 基本结构 主要参数 MATALB代码 结果图 展望 背影 现在生活,为节能减排,减少电能…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring Boot 框架总结
Spring Boot 框架总结 1. springboot的引言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的 初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不 再需要定义样板化的配置。通过这种方式࿰…...
![](https://img-blog.csdnimg.cn/357e2e1a5d154f0493d15bfe3430059b.png)
【数据结构】第五站:带头双向循环链表
目录 一、链表的八种结构 二、带头双向循环链表的实现 1.链表的定义 2.链表的接口定义 3.接口的具体实现 三、带头双向循环链表的完整代码 四、顺序表和链表的区别 一、链表的八种结构 我们已经知道链表可以有以下三种分法 而这三种结构又可以排列组合,形成八…...
![](https://www.ngui.cc/images/no-images.jpg)
Springboot生成二维码
Springboot生成二维码整合 我们使用两种方式,去生成二维码,但是其实,二维码的生成基础,都是zxing包,这是Google开源的一个包,第一种是使用原始的zxing方式去实现,第二种是使用hutool来实现&…...
![](https://img-blog.csdnimg.cn/img_convert/5a62d0becec182f02210c90752e578e5.png)
“独裁者”何小鹏,再造小鹏汽车
文丨智能相对论 作者丨沈浪 如果没有何小鹏,小鹏汽车将失去灵魂。 2014年,夏珩、何涛等人在广州组建小鹏汽车(当时还叫“橙子汽车”),何小鹏还只是股权投资人。 夏珩、何涛原任职于广汽,负责新能源汽车…...
![](https://img-blog.csdnimg.cn/44220da5e4fb46efbb5f3f3fdf057bc4.gif)
数据结构 | 泛型 | 擦除机制| 泛型的上界
目录 编辑 1.泛型 1.1Object类引出泛型概念 2.泛型语法 2.1泛型编写代码 3.泛型的机制 3.1擦除机制 4.泛型的上界 4.1泛型上界的语法 4.2泛型上界的使用 5.泛型方法 5.1泛型方法语法 5.2泛型方法的使用 1.泛型 一般的类和方法中,只能使用具体的代码…...
![](https://www.ngui.cc/images/no-images.jpg)
C++拷贝构造函数(复制构造函数)详解
拷贝和复制是一个意思,对应的英文单词都是copy。对于计算机来说,拷贝是指用一份原有的、已经存在的数据创建出一份新的数据,最终的结果是多了一份相同的数据。例如,将 Word 文档拷贝到U盘去复印店打印,将 D 盘的图片拷…...
![](https://www.ngui.cc/images/no-images.jpg)
python学习——多线程
python学习——多线程概念python中线程的开发线程的启动线程的退出和传参threading的属性和方法threading实例的属性和方法多线程daemon线程和non-demone线程daemon线程的应用场景线程的jointhreading.local类线程的延迟执行:Timer线程同步Event 事件Lock ——锁加锁…...
![](https://img-blog.csdnimg.cn/7caf27c432544fd1ab38c60e4667ed35.png)
SAP 系统中过账码or记账码
SAP中过账码和记账码是指同一个事物。 在实际业务中,记账码就是只有“借”和“贷”, 而SAP中Posting Code肩负着更多的任务: 1)界定科目类型, 2)借贷方向, 3)凭证输入时画面上的字…...
![](https://img-blog.csdnimg.cn/ee032a57a9834cb1801423f19407ec36.png)
【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS
初识FreeRTOS一、实时操作系统概述1、概念2、RTOS的必要性3、RTOS与裸机的区别4、FreeRTOS的特点二、FreeRTOS的架构三、FreeRTOS的代码架构一、实时操作系统概述 1、概念 RTOS:根据各个任务的要求,进行资源(包括存储器、外设等)…...
![](https://www.ngui.cc/images/no-images.jpg)
Python中 __init__的通俗解释是什么?
__init__是Python中的一个特殊方法,用于在创建对象时初始化对象的属性。通俗来讲,它就像是一个构造函数,当我们创建一个类的实例时,__init__方法会被自动调用,用于初始化对象的属性。 举个例子,如果我们定义…...
![](https://img-blog.csdnimg.cn/fd93c95cfd3e40c686b74f8807b695cb.jpeg)
网友真实面试总结出的自动化测试面试题库
目录 常规问题 手工测试部 自动化测试 自动化测试面试题2:selenium篇 常规问题 1、如何快速深入的了解移动互联网领域的应用 (答案:看http协议 restful api知识 json加1分) 2、对xx应用自己会花多久可以在业务上从入门到精通&…...
![](https://img-blog.csdnimg.cn/b85141a918ca4f7d9bb0a82cd7a727a0.png)
2023 年最佳 C++ IDE
文章目录前言1. Visual Studio2. Code::Blocks3. CLion4. Eclipse CDT(C/C 开发工具)5. CodeLite6. Apache NetBeans7. Qt Creator8. Dev C9. C Builder10. Xcode11. GNAT Programming Studio12. Kite总结前言 要跟踪极佳 IDE(集成开发环境&…...
![](https://www.ngui.cc/images/no-images.jpg)
在Ubuntu上使用VSCode编译MySQL Connector/C连接库
首先下载并解压MySQL Connector/C源码,然后执行以下步骤: 1、安装MySQL Connector/C依赖:在终端中输入以下命令来安装MySQL Connector/C的依赖项: sudo apt-get install build-essential cmake 2、下载并解压MySQL Connector/C源…...
![](https://img-blog.csdnimg.cn/ced8e0ef031649d2ae22d49af4ca6c87.png)
单声道数字音频放大器AD87589
AD87589是一种集成音频系统解决方案,嵌入数字音频处理、功率级放大器和立体声2Vrms线路驱动器。 AD87589具有可编程转换速率控制的输出缓冲器,可直接驱动一个(单声道)或两个(立体声)扬声器。此外࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
网络的UDP协议和TCP协议
协议:数据在网络中的传输规则,常见的协议有 UDP协议和TCP协议 协议:计算机网络中,连接和通信的规则被称为网络通信协议 UDP协议:用户数据报协议,是面向无连接通信协议,速度快,有大小…...
![](https://img-blog.csdnimg.cn/ce46fdce66854635b9bca7db63865fef.gif)
【JaveEE】多线程之阻塞队列(BlockingQueue)
目录 1.了解阻塞队列 2.生产者消费者模型又是什么? 2.1生产者消费者模型的优点 2.1.1降低服务器与服务器之间耦合度 2.1.2“削峰填谷”平衡消费者和生产的处理能力 3.标准库中的阻塞队列(BlockingQueue) 3.1基于标准库(Bloc…...
![](https://img-blog.csdnimg.cn/img_convert/1bacb6055b88804d81f3d0411b846649.png)
分布式ELK日志监控系统环境搭建
文章目录1.1为什么需要监控项目日志1.2ELK日志监控系统介绍1.3ELK的工作流程1.4ELK环境搭建1.4.1Elasticsearch的安装1.4.2Kibana的安装1.4.3Logstash的安装1.4.4数据源配置1.4.5日志监测测试1.4.6日志数据可视化展示1.1为什么需要监控项目日志 项目日志是记录项目运行过程中产…...
![](https://img-blog.csdnimg.cn/img_convert/017f8ce3c6924b80a704e500a4756b7b.png)
【数据结构刷题集】链表经典习题
😽PREFACE🎁欢迎各位→点赞👍 收藏⭐ 评论📝📢系列专栏:数据结构刷题集🔊本专栏涉及到题目是数据结构专栏的补充与应用,只更新相关题目,旨在帮助提高代码熟练度&#x…...
![](https://img-blog.csdnimg.cn/6b4a9a67d6a34be69678d2f3ef223f9b.png)
JavaSE(3.27) 异常
学习不要眼高手低,学习是一点点积累的。即使你现在很菜,坚持学一个学期不会差的!只要花时间学习,每天都是进步的,这些进步可能你现在看不到,但是不要小瞧了积累效应,30天,60天&#…...
![](https://www.ngui.cc/images/no-images.jpg)
【看门狗】我说的是定时器不是狗啊
单片机在运行中死机了,你或许只能按2下电源键(重启)或1下复位键。 这里简单说一下重启和复位: 从RESET引脚复位,只有MCU复位。而外设看情况,有的可能会有MCU同步复位或者重新初始化。也有可能一些保持复位…...
![](https://img-blog.csdnimg.cn/img_convert/d68b08547ce6298e31d306d62884df4b.jpeg)
24万字智慧城市顶层设计及智慧应用解决方案
本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。部分资料内容: 4.8 机房消防系统 4.8.1消防系统概况 根据本工程机房消防系统的特殊要求,整个消防系统由火灾报警系统、消防联动系统和气体灭火系统三部…...
![](https://www.ngui.cc/images/no-images.jpg)
跨境电商卖家工具——跨境卫士内容介绍
一、简介 跨境卫士是一款集合多种跨境电商工具的综合软件,由知名跨境电商服务商跨境通开发。跨境卫士可以帮助卖家完成海外物流管理、订单处理、报关报税、市场营销等多项任务,同时还提供数据分析、客户服务、运营管理等一系列支持功能,方便卖…...
![](https://img-blog.csdnimg.cn/f86784b114014640a8d5000e4ac9afab.png)
Redis 常用基本命令
关于 redis 的常用基本命令 目录 关于 redis 的常用基本命令 1. 关于 key 的操作 2. HyperLogLog 求近似基数 3. 排序相关命令 4. Limit 限制查询 1. 关于 key 的操作 判断某个 key 是否存在 # 格式: exists key exists name# 存在name 返回1 # 不存在name 返回0 查找或…...
![](https://images2015.cnblogs.com/blog/20480/201607/20480-20160719085604326-1541178487.png)
深圳网站制作比较好公司/seo托管服务
启用外部程序: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe 命令行参数 /rootsuffix Exp 转载于:https://www.cnblogs.com/shiningrise/p/5683424.html...
![](/images/no-images.jpg)
怎么自己制作个网站/水果店推广营销方案
文章目录MLpython稀疏矩阵的存储和表示CSR格式CSR格式🎈NNZCoordinate list (COO)Compressed sparse row (CSR, CRS or Yale format)🎈三个数组根据ROW_INDEX划分数组V或COL_INDEX数组名称demos in scipyegeg冗余分析Yale sparse matrixCSR编码效益分析&…...
![](/images/no-images.jpg)
娄底市网站建设制作/chrome谷歌浏览器
一个组织拥有多个用户,一个组织有多个角色,一个角色有多个组织 package com.eshore.ismp.permission.model;import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; impor…...
![](/images/no-images.jpg)
网站收录网/中国搜索网站排名
import osprint(os.getcwd())os.chdir(C:\Python33\HeadFirstPython\hfpy_code\chapter6) #将工作空间修改为文件所在的目录#定义函数get_filedata从文件中取值def get_filedata(filename):try:with open(filename) as f: #with语句打开和自动关闭文件dataf.readline() #从文件…...
![](/images/no-images.jpg)
站长之家是什么/惠州seo公司
$_G 保存了 Discuz! 中所有的预处理数据缓存能够很好的提高程序的性能,一些配置数据没必要每次都查询数据库,只要在修改了的时候更新下缓存即可。Discuz! 中所有的缓存保存在 $_G[cache] 中$_G[member] 会员信息数据$_G[uid] 用户 uid$_G[username] 用户…...
![](https://s3.51cto.com/wyfs02/M01/72/40/wKiom1XfD2mx630IAAF7aDzzHpo454.jpg)
唐山公司网站建设 中企动力/头条搜索
1、源代码安装nginx1)、所需环境:开发环境:Development toolsServer Platform DevelopmentAdditional Developmentpcre-develnginx-1.6.0.tar.gz2)、源码安装nginx:拆解源代码包到/usr/local/src/目录下创建系统账号和组nginx[roo…...