Linux:基础IO
目录
1. stdin & stdout & stderr
2. 系统文件I/O
1. 接口介绍
open
write
read
close
lseek
2. open函数返回值
3. 文件描述符fd
0 & 1 & 2
文件描述符的分配规则
重回定向
dup2
简易Shell的模拟实现
4. FILE
5. 再谈对文件的理解
1. stdin & stdout & stderr
a: C语言默认会打开三个输入输出流,分别是stdin, stdout, stderr
- stdin:标准输入流,通常用于从键盘接收输入,其类型是
FILE*
。 - stdout:标准输出流,通常用于向屏幕输出文本,其类型也是
FILE*
。 - stderr:标准错误流,用于输出错误信息,同样也是
FILE*
类型。
b: 仔细观察发现,这三个流的类型都是FILE*, fopen返回值类型,文件指针
FILE* fopen(const char *filename, const char *mode);
- 第一个参数
filename
是要打开的文件的名称。 - 第二个参数
mode
指定文件打开的模式,如 "r" 表示只读,"w" 表示写入并覆盖现有内容等。
fopen
成功时返回一个 FILE*
类型的非空指针,失败时返回 NULL
。这里要注意的是,虽然 stdin
、stdout
和 stderr
的类型都是 FILE*
,但它们不是通过 fopen
函数获得的,而是 C 语言运行时环境自动提供的。
文件指针 FILE*
是 C 语言标准 I/O 库中用于指向文件结构的指针,该结构包含了进行文件操作所需的所有信息,如文件位置指示器、文件状态标志等。当你使用 fopen
打开一个文件时,返回的 FILE*
指针指向这样一个结构,它允许你通过标准 I/O 函数(如 fread
、fwrite
、fprintf
等)对文件进行操作。
2. 系统文件I/O
操作文件,除了上述C接口,我们还可以采用系统接口来进行文件访问。
1. 接口介绍
这些操作都很简单,需要的时候在命令行 man 一下!
open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定一个且只能指定一个O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限O_APPEND: 追加写返回值:成功:新打开的文件描述符失败:-1
write
ssize_t write(int fd, const void *buf, size_t count); 参数:int fd:文件描述符,这是一个整数,代表要写入数据的文件或其他 I/O 设备。对于标准输入、输出和错误流,文件描述符分别为 0(stdin)、1(stdout)和 2(stderr)。const void *buf:指向要写入的数据缓冲区的指针。buf 参数是一个 const void* 类型的指针,意味着它可以指向任何类型的数据。数据的实际类型应与 write 被调用的上下文匹配。size_t count:要写入的字节数。count 参数指定了从 buf 指向的缓冲区中写入多少字节的数据到文件描述符 fd。返回值:write 函数的返回值表示成功写入的字节数。在成功的情况下,返回值应该等于 count。如果发生错误,函数返回 -1 并设置 errno 以指示错误类型。
read
ssize_t read(int fd, void *buf, size_t count); 参数:int fd:文件描述符,这是一个表示要读取数据的文件、套接字或其他 I/O 设备的整数。例如,标准输入(stdin)的文件描述符是 0。void *buf:指向一个缓冲区的指针,用于存储从文件描述符 fd 读取的数据。buf 参数是一个 void* 类型的指针,这意味着它可以指向任何类型的数据缓冲区。调用者应确保提供足够大的缓冲区来存储预期数量的数据。size_t count:要读取的字节数。count 参数指定了从文件描述符 fd 读取的最大字节数。返回值:read 函数的返回值表示成功读取的字节数,如果返回值为 0,则表示到达了文件末尾(EOF)。如果发生错误,函数返回 -1 并设置全局变量 errno 以指示错误类型。
close
#include <unistd.h>int close(int fd);功能说明:close 函数用于关闭一个由 fd 参数指定的文件描述符。文件描述符通常与打开的文件、套接字或其他 I/O 设备相关联。参数:int fd:要关闭的文件描述符的整数标识符。返回值:成功时,返回 0。失败时,返回 -1,并设置 errno 以指示错误。
lseek
#include <sys/types.h>
#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);功能说明:lseek 函数用于重新定位指定文件描述符 fd 的文件读取/写入偏移量。参数:int fd:文件描述符,是一个整数,表示要操作的文件或 I/O 设备。off_t offset:要设置的偏移量。这个值的含义取决于 whence 参数。int whence:指定 offset 参数如何被解释:SEEK_SET:文件开头,offset 是文件开头的绝对偏移量。SEEK_CUR:当前位置,offset 是相对于当前文件位置的偏移量。SEEK_END:文件末尾,offset 是相对于文件末尾的偏移量,通常用于设置文件指针到文件末尾之后。返回值:成功时,lseek 返回新的文件偏移量,即从文件开头到当前位置的字节数。失败时,返回 (off_t)-1,并且 errno 被设置为表示错误原因的值。错误代码:EBADF:指定的文件描述符 fd 无效。EINVAL:whence 参数的值无效。EOVERFLOW:新的文件偏移量超出了 off_t 类型可以表示的范围描述:lseek 函数允许程序修改文件的内部偏移量,该偏移量决定了下一次读取或写入操作的起始点。如果 lseek 成功执行,文件的当前偏移量将被更新为指定的新位置。对于某些类型的文件(如某些管道或设备文件),lseek 可能不会产生预期的效果或可能失败。注意:lseek 通常用于基于文件偏移量进行操作的文件 I/O 模式。对于不支持随机访问的 I/O 设备,lseek 可能无法改变偏移量,或者可能总是返回 0。
2. open函数返回值
先来认识一下两个概念: 系统调用 和 库函数。上面的 fopen fclose fread fwrite 都是C标准库当中的函数,我们称之为库函数(libc)。而, open close read write lseek 都属于系统提供的接口,称之为系统调用接口。
3. 文件描述符fd
文件描述符就是Unix和类Unix操作系统中用于表示打开文件或其他I/O资源的整数。
0 & 1 & 2
Linux进程默认情况下会有3个缺省打开的文件描述符:
分别是标准输入0, 标准输出1, 标准错误2.
0,1,2对应的物理设备一般是:键盘,显示器,显示器
所以输入输出还可以采用如下方式:
文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针!所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件!!!
文件描述符的分配规则
文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。
重回定向
有了对 文件描述符的分配规则 的认识我们来看一段代码:
#include <stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{::close(1);int fd = open("./myfile.txt", O_WRONLY | O_CREAT, 00644);if (fd < 0){perror("open");return 1;}printf("fd: %d\n", fd);fflush(stdout);::close(fd);exit(0);
}
此时,我们发现,本来应该输出到显示器上的内容,输出到了文件 myfile 当中。这种现象叫做输出重定向。
常见重定向:
1:> (大于符号) - 强制输出重定向 |
|
2:>> (双大于符号) - 追加输出重定向 |
|
3:< (小于符号) - 输入重定向 |
|
4:2> (标准错误重定向) |
|
5:&> (输出和错误输出重定向) |
|
6:| (管道符) - 管道重定向 |
|
7:* (星号)和 ? (问号) - 通配符 |
|
dup2
#include <unistd.h>int dup2(int oldfd, int newfd);参数:int oldfd:要复制的旧文件描述符。int newfd:复制到的新文件描述符。返回值:成功时,返回新的文件描述符(newfd)。失败时,返回 -1 并设置 errno 以指示错误。错误代码:EBADF:oldfd 或 newfd 是一个无效的文件描述符。EINVAL:newfd 是一个保留的文件描述符编号。描述:dup2 函数通常用于改变一个文件描述符的值,或者将一个文件描述符的作用扩展到另一个文件描述符。如果 newfd 是一个已经打开的文件描述符,调用 dup2 会导致 newfd 关闭并丢弃其关联的文件状态,然后 newfd 被设置为与 oldfd 相同。dup2 可用于重定向标准 I/O 流(如 stdin、stdout、stderr)。
直接看代码感受感受:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{int fd = ::open("./log.txt", O_CREAT | O_RDWR);if (fd < 0){perror("open");return 1;}::close(1);::dup2(fd, 1);for (;;){char buf[1024] = {0};ssize_t read_size = ::read(0, buf, sizeof(buf) - 1);if (read_size < 0){perror("read");break;}printf("%s", buf);fflush(stdout);}return 0;
}
简易Shell的模拟实现
http://t.csdnimg.cn/lecBdhttp://t.csdnimg.cn/lecBd
4. FILE
a:因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过fd访问的。
b:所以C库当中的FILE结构体内部,必定封装了fd。
来段代码来感受一下这些接口都有什么区别:
直接执行:
重定向:./test > ./file
为什么会是这个结果?
我们发现 printf 和 fwrite (库函数)都输出了2次,而 write 只输出了一次(系统调用)。为什么呢?肯定和fork有关!
一般C库函数写入文件时是全缓冲的,而写入显示器是行缓冲。
printf fwrite 库函数会自带缓冲区,当发生重定向到普通文件时,数据的缓冲方式由行缓冲变成了全缓冲。
而我们放在缓冲区中的数据,就不会被立即刷新,甚至fork之后
但是进程退出之后,会统一刷新,写入文件当中。
但是fork的时候,父子数据会发生写时拷贝,所以当你父进程准备刷新的时候,子进程也就有了同样的一份数据,随即产生两份数据。
write 没有变化,说明没有所谓的缓冲。
综上: printf fwrite 库函数会自带缓冲区,而 write 系统调用没有带缓冲区。另外,我们这里所说的缓冲区,都是用户级缓冲区。其实为了提升整机性能,OS也会提供相关内核级缓冲区,不过不再我们讨论范围之内。
那这个缓冲区谁提供呢? printf fwrite 是库函数, write 是系统调用,库函数在系统调用的“上层”, 是对系统调用的“封装”,但是 write 没有缓冲区,而 printf fwrite 有,足以说明,该缓冲区是二次加上的,又因为是C,所以由C标准库提供。
5. 再谈对文件的理解
我们要对文件进行操作,前提是我们的程序先要跑起来。文件的打开和关闭,其实是CPU在执行我们的代码。什么是文件?
文件 = 内容(该目录里的所有文件信息详细数据) + 属性
http://t.csdnimg.cn/k8Ngthttp://t.csdnimg.cn/k8Ngt
A:打开文件:本质是进程打开文件。
B:文件没有被打开的时候,在哪里?存在磁盘里。
C:进程能到打开很多文件吗?能!(fd就是组织文件数组的下标!!!)
D:文件 -> 磁盘 -> 外设 -> 硬件 -> 向文件中写入,本质向硬件中写入
-> 用户没有权利直接写入 -> OS是硬件的管理者 -> 通过OS写入
->OS必须给我们提供系统调用
-> fopen/fwrite/fread/fprintf/scanf/printf/cin/cout...
-> 我们用的C/C++/... 其实都是对系通过调用接口的封装!
E:open的过程。write、read函数,本质是拷贝函数!!!
F:为什么 fd: 0、1、2 默认是打开的 ?键盘、鼠标、显示器、都是硬件啊?
Linux下一切皆文件!
在Linux和Unix系统中,"一切皆文件"的概念是一个核心哲学,意味着系统资源、硬件设备和常规文件都可以统一地用文件描述符来访问。文件描述符(fd)是一个抽象的概念,用于表示打开的文件或其他输入/输出资源。
E:C语言或者其他语言为什么要将系统调用进行封装?
系统调用不具有跨平台性,由于系统不同,系统调用的接口可能就不一样,所有的语言都要对不同的平台的系统调用进行封装,屏蔽掉底层的差异,实现自身的跨平台性!!!
相关文章:
Linux:基础IO
目录 1. stdin & stdout & stderr 2. 系统文件I/O 1. 接口介绍 open write read close lseek 2. open函数返回值 3. 文件描述符fd 0 & 1 & 2 文件描述符的分配规则 重回定向 dup2 简易Shell的模拟实现 4. FILE 5. 再谈对文件的理解 1. stdin …...
奥运奖牌窥视
1 前言 2024巴黎奥运会已经闭幕了,中国队创纪录地获得了海外举办的奥运会的最佳成绩,我们来个管中窥豹,看看中国队从哪些项目中取得了奖牌。 2 奖牌组成 游泳真是大项,小项数量众多,比如个人自由泳就有100m、200m、4…...
RUST实现远程操作电脑手机
简介: Rust Desk 是一个开源的远程桌面软件,能够完全替代向日葵和ToDesk的功能,包括电脑控制电脑、电脑控制手机、手机控制电脑等。它是完全免费的。 下载: 需要下载 Rust Desk 的服务端和客户端安装包。 安装: 服务…...
spring01-spring容器启动过程分析
【README】 本文总结自《spring揭秘》,作者王福强,非常棒的一本书,墙裂推荐; spring容器根据配置元素组装可用系统分2个阶段,包括spring容器启动, springbean实例化阶段; 本文详细分析spring容…...
RAG与LLM原理及实践(12)--- Milvus RRFRanker的使用场景及源码分析
目录 背景 rrfRanker 简介与实例 核心逻辑 实例 蕴含思想 rrfRanker VS weightedRanker rrfRanker weightedRanker 场景使用区别 RRFRanker 使用场景 weightedRanker 使用场景 代码 代码实现 运行结果 修改代码 再次运行结果 源码 源码实现 解释 Ranker 可…...
Nginx与Tomcat的区别
Nginx与Tomcat的区别 —— 经验笔记 引言 在现代Web开发中,选择合适的服务器软件对于构建高性能、可靠的应用程序至关重要。Nginx 和 Tomcat 是两种常见的服务器软件,尽管它们都可以被归类为Web服务器,但它们的设计目标和应用场景有着本质的…...
LeetCode 3151.特殊数组 I
【LetMeFly】3151.特殊数组 I 力扣题目链接:https://leetcode.cn/problems/special-array-i/ 如果数组的每一对相邻元素都是两个奇偶性不同的数字,则该数组被认为是一个 特殊数组 。 Aging 有一个整数数组 nums。如果 nums 是一个 特殊数组 ÿ…...
【产品那些事】The OX Active ASPM Platform
文章目录 前言关于OX Security产品理念 流程体验Complete Visibility:将安全无缝嵌入到SDLC中PBOMOSC&R coverageContextualized Prioritization:快速解决最关键的风险Accelerated Response:简化安全流程See Beyond the Code:…...
欢迪迈手机商城设计与开发
TOC springboot137欢迪迈手机商城设计与开发 绪论** 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化࿰…...
Endnote与word关联 解决方案: COM加载项-----》CWYW插件安装
1、首先说一下本次情况,office的版本是2019,后安装的Endnote 9。旧版word也可按此方法尝试。 2、先找到关键的EndNote Cwyw.dll文件。应在此目录下:C:\Program Files (x86)\EndNote X7\Product-Support\CWYW。 3、如没有EndNote Cwyw.dll文…...
用R语言运用 Shiny 包打造基于鸢尾花数据集的交互式数据可视化应用
下面内容摘录自《R 语言与数据科学的终极指南》专栏文章的部分内容,每篇文章都在 5000 字以上,质量平均分高达 94 分,看全文请点击下面链接: 1章4节:数据可视化, R 语言的静态绘图和 Shiny 的交互可视化演…...
Upload-Lab第3关:如何巧妙应对黑名单文件后缀检测?
关卡介绍 在Pass03中,我们面临的挑战是绕过文件上传功能的黑名单检测机制。黑名单检测是一种常见的安全措施,它通过检查上传文件的后缀来阻止特定类型的文件(如 .php, .exe)被上传。在这一关,我们需要找到一种方法,上传一个可以执行的恶意文件,同时绕过黑名单检测。 …...
SSLVPN对比IPSECVPN安全设备的起源、发展、以及目前行业使用场景
前言 SSL VPN(Secure Sockets Layer Virtual Private Network)是一种利用SSL/TLS(Transport Layer Security,传输层安全)协议来创建安全连接的技术,它允许远程用户通过公共网络(通常是互联网&am…...
Hadoop大数据集群搭建
一、虚拟机配置网络 1、配置文件 进入“/etc/sysconfig/network-scripts”目录,查看当前目录下的“ifcfg-ens33”文件 对“ens33”文件进行配置 2、重启网络 systemctl restart network 3、测试网络 Ping www.baidu.com 4、设置虚拟机主机名称 5、绑定主机名和…...
【技术前沿】MetaGPT入门安装部署——用多个大语言模型解决任务!一键安装,只需填写OpenAI API
项目简介 MetaGPT 是一个多智能体框架,旨在构建全球首家 “AI 软件公司”。该项目通过为 GPT 分配不同的角色,模拟产品经理、架构师、工程师等职业,协同完成复杂的软件开发任务。MetaGPT 将一个简单的需求转化为完整的软件开发流程ÿ…...
#compsoer基本使用01#
Composer 是 PHP 的依赖管理工具,它允许开发人员管理和安装项目所需的依赖包。 1:查看Compsoer的全局配置命令 composer config -g --list --verbose 这个可以查看composer的镜像地址。例如 [repositories.packagist.org] type (string) : composer [repositor…...
基于c++的yolov5推理之前处理详解及代码(一)
目录 一、前言: 二、关于环境安装: 三、首先记录下自己的几个问题 问题:c部署和python部署的区别? 四、正文开始 4.1 图像预处理讲解 1、BGR---->RBG 2、等比例放缩图片(涉及到短边的填充) 3、归一化…...
Oracle(55)什么是并行查询(Parallel Query)?
并行查询(Parallel Query)是数据库管理系统中的一种查询优化技术,它允许数据库引擎同时使用多个处理器或线程来执行查询操作。通过将查询任务分解为多个子任务,并在多个处理器上同时执行这些子任务,可以显著提高查询的…...
关于 Lora中 Chirp Spread Spectrum(CSS)调制解调、发射接收以及同步估计的分析
本文结合相关论文对CSS信号的数学形式、调制解调、发射接收以及同步估计做了全面分析,希望有助于更好地理解lora信号 long-range (LoRa) modulation, also known as chirp spread spectrum (CSS) modulation, in LoRaWAN to ensure robust transmission over long d…...
Java - API
API全称"Application Programming Interface",指应用程序编程接口 API(JDK17.0)链接如下 : Overview (Java SE 17 & JDK 17) (oracle.com)https://docs.oracle.com/en/java/javase/17/docs/api/中文版: Java17中…...
力扣 3152. 特殊数字Ⅱ
题目描述 queries二维数组是nums数组待判断的索引区间(左闭右闭)。需要判断每个索引区间中的nums相邻元素奇偶性是否不同,如果都不同则该索引区间的搜索结果为True,否则为False。 暴力推演:也是我最开始的思路 遍历q…...
识别和缓解软件安全威胁的最佳工具
软件安全威胁会给企业带来重大损失,从经济损失到声誉受损。 企业必须主动识别和缓解这些威胁,防止它们造成危害。 幸运的是,有许多工具可以帮助企业识别和缓解软件安全威胁。 在本博客中,我们将探讨识别和缓解软件安全威胁的顶…...
Linux下的压缩与解压:掌握核心命令行工具
目录 一.前言 二.压缩文件概述 三.tar:Linux 的通用归档工具 常用 tar 命令 四.gzip:强大的压缩程序 常用 gzip 命令 五.zip 和 unzip:处理 ZIP 压缩文件 常用 zip 和 unzip 命令 实用技巧和最佳实践 六.结语 一.前言 在 Linux …...
BGP选路实验
要求: 1.如图连接网络,合理规格IP地址,AS200内IGP协议为OSPF; 2.R1属于AS 100;R2-R3-R4小AS234、R5-R6-R7小AS567,同时声明大AS 200,R8属于AS300; 3.R2-R5、R4-R7之间为联邦EBGP邻居…...
白骑士的C#教学高级篇 3.3 网络编程
网络编程是现代应用程序开发中至关重要的一部分。C# 提供了一套丰富的 API 来处理基本网络通信、Web请求与响应。在本节中,我们将深入探讨这些内容,帮助您掌握如何在 C# 中进行网络编程。 基本网络通信 基本网络通信通常涉及套接字(Socket&a…...
AI大模型赋能游戏:更智能、更个性化的NPC
参考论文:https://arxiv.org/abs/2403.10249 在传统游戏中,NPC(非玩家角色)的行为往往是预先设定好的,缺乏灵活性和变化性。然而,基于大模型的NPC可以利用其强大的推理和学习能力,实时生成对话…...
pymysql的上下文管理器:简化数据库操作
pymysql的上下文管理器:简化数据库操作 当我们使用 pymysql 操作数据库时,管理数据库连接和游标的生命周期是一项重要的任务。Python 的上下文管理器提供了一种优雅的方式来处理资源的获取和释放。在本文中,我们将探索如何创建一个简单的 py…...
AI秘境-墨小黑奇遇记 - 修炼成神经(二)
在解开了感知机和门电路的谜题后,墨小黑对人工智能的世界渐渐产生了浓厚的兴趣。他开始意识到,自己不仅是在学习一门复杂的技术,更是在探索一个充满未知与挑战的神秘领域。 入夜,墨小黑一脸无奈地盯着电脑屏幕,思考着自…...
计算机网络之分组交换时延的计算
一.类型 分组交换的时延包括一下几种: 1.1发送时延 发送时延,也叫传输时延,结点将分组的所有比特推向链路所需要的时间,即从发送分组的第一个比特算起,到该分组的最后一个比特发送完为止。 发送时延 分组长度 / 发…...
虚幻5|入门AI行为树,建立敌人
本章分成两块部分一块是第一点的制作一个简单的AI,后面第二点之后是第二部分建立ai行为树。这两个部分是一个衔接,最好不要跳看 一,制作一个简单的AI 1.首先,我们创建一个敌人的角色蓝图,添加一个场景组件widget用于…...
网站后缀org/百度网页翻译
Oracle基本操作(登陆、用户、表空间、exp/imp、权限)1. 登陆 (在windows上CMD下执行)1.1. 登陆sys帐户SQLPLUS sys AS SYSDBA1.2. 登陆普通用户SQLPLUS 用户名/密码SQLPLUS 用户名/密码111.111.111.111:1521/test2. 创建用户一般分为四步2.1. 创建临时表空间CREATE TEMPORARY T…...
网站开发教程PDF微盘下载/淘数据官网
Visual Basic .NET 教程 模块五 菜单栏、工具栏、状态栏 能力目标:能够设计、创建和使用菜单、工具栏和状态栏 知识目标:掌握菜单控件、工具栏控件和状态栏控件常用的属性、方法和事件 一个典型的Windows应用程序必然包含菜单、工具栏和状态栏&#x…...
惠州建设工程造价管理协会网站/英文网站推广
iPad 加 iOS 11,为十分强大再加一分。一直以来,iPad 都是高效工作方式、畅快娱乐体验和强大学习工具的代表。而 iOS 11 还将其带到了一个新境界。众多新特性和新功能将帮你更高效快捷地处理事务,为你带来更强大、更个性化的 iPad 使用体验。而…...
化妆网站源码/国内外十大免费crm软件推荐
近日,苹果开发者博客更新了一篇关于Swift 5的文章,带来了Swift 5新特性的消息,其中最受开发期待的莫过于iOS 12.2将带来ABI 稳定性,这意味着基础库将植入系统中,不再包含在App中,应用程序的体积会更小&…...
深圳做模板网站/真实的网站制作
在HT for Web提供了一下几种常用的Editor,分别是: slider:拉条color picker:颜色选择器enum:枚举类型boolean:真假编辑器string:普通的文本编辑器除了这几种常用编辑器之外,用户还可…...
漳州城乡建设局网站/搜狗搜索引擎优化论文
如何使用 Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等。当前目录下包含Dockerfile,使用命令build来创建新的image,并命名为edwardsbean/centos6-jdk1.7: docker build -t edwardsbean/centos6-jdk1.7 .Dockerfile关键字 如何编写一个Dockerfile,格式如下…...