挂载
在Linux中,挂载是将文件系统连接到文件系统树中的过程,使得文件系统中的文件和目录可以在特定的挂载点上访问。通过挂载,可以将各种存储设备(如硬盘分区、光盘、USB驱动器等)与文件系统关联起来。
一般的Linux挂载流程:
- 确定要挂载的设备:首先,需要确定要挂载的设备,可以使用命令如
lsblk
、fdisk -l
、blkid
等来查看系统中的设备列表。 - 创建挂载点:在挂载设备之前,需要创建一个目录作为挂载点。可以选择任意合适的目录作为挂载点,通常在
/mnt
或/media
目录下创建。使用mkdir
命令可以创建目录,例如:
mkdir /mnt/mydrive
- 执行挂载命令:使用
mount
命令将设备挂载到指定的挂载点上,语法如下:
mount <设备> <挂载点>
其中,设备
是要挂载的文件系统的设备名称,可以是设备文件(如/dev/sda1
)或UUID。挂载点
是文件系统要连接到的目录路径。 例如,将/dev/sdb1
设备挂载到/mnt/mydrive
目录,可以使用以下命令:
mount /dev/sdb1 /mnt/mydrive
- 访问挂载的文件系统:一旦挂载成功,您可以通过挂载点路径访问文件系统中的文件和目录。例如,通过
/mnt/mydrive
路径可以访问挂载的文件系统。 - 卸载挂载的文件系统:当您不再需要访问挂载的文件系统时,可以使用
umount
命令将其卸载,语法如下:
umount <挂载点>
例如,卸载/mnt/mydrive
目录下的文件系统,可以使用以下命令:
umount /mnt/mydrive
文件
- 带缓存文件 文件类型指针
- 非缓存文件文件描述符
- 文件类型->就是结构体
缓存文件操作
fopen
打开文件
查看文件手册(fopen为例)
#include<stdio.h>
FILE *fopen(const char *path, const char *mode)
FILE *fdopen(int fildes, const char *mode)
FILE *freopen(const char *path, const char *mode,FILE *stream)
头文件
函数的参数
path
文件名称+文件路径 mode
模式 模式r :只读 r:+读写 w :只写,且原文件被清空 w+:写,且如果文件不存在则创建文件,文件存在则文件清空 a:只能写文件存在,文件末尾写入,不存在创建文件再写 a+:可读可写
读文件
- fgetc
- fgets
- fread
写文件
fputc fputs fwrite
fclose
关闭文件
feof
判断文件指针所指向的文件是否已经达到了文件末尾
if(feof(fpr)){
……
}
代码示例1:fgetc,fputc
#include<stdio.h>
#include<stdlib.h>
int main(){
FILE *fpr,*fpw;
int ch;
if((fpr=fopen("hello.c","r"))==NULL)
{
perror("open file error:");
exit(0);
}
if((fpw=fopen("hellocopy1.c","w"))==NULL)
{
perror("open file error:");
exit(0);
}
/*
while((ch=fgetc(fpr))!=EOF){
fputc(ch, fpw);
}
*/
while (1) {
ch = fgetc(fpr);
if (ch < 0){
break;
}
fputc(ch, fpw);
}
fputc(ch,fpw);
fclose(fpr);
fclose(fpw);
return 0;
}
代码示例2:fgets,fputs
#include<stdio.h>
#include<stdlib.h>
#define B 10
int main(){
FILE *fpr,*fpw;
char b[B];
if((fpr=fopen("hello.c","r"))==NULL)
{
perror("open file error:");
exit(0);
}
if((fpw=fopen("hellocopy2.c","w"))==NULL)
{
perror("open file error:");
exit(0);
}
/*
while(1){
if(fgets(b,B,fpr)==NULL){
break;
}
fputs(b,fpw);
}
fputs(b,fpw);
*/
while((fgets(b,B,fpr))!=NULL){
fputs(b,fpw);
}
fclose(fpr);
fclose(fpw);
return 0;
}
代码示例3:fread,fwrite
#include<stdio.h>
#include<stdlib.h>
#define B 10
int main(){
FILE *fpr,*fpw;
char ch;
int size;
char b[B];
if((fpr=fopen("hello.c","r"))==NULL)
{
perror("open file error:");
exit(0);
}
if((fpw=fopen("hellocopy3.c","w"))==NULL)
{
perror("open file error:");
exit(0);
}
while(1){
if((size = fread(b,1,B,fpr))<=0)
//用size来存大小
break;
//1是每个数据项的大小,而B是要读取的数据项的数量
fwrite(b,1,size,fpw);
}
fclose(fpr);
fclose(fpw);
return 0;
}
fread(b,1,B,fpr)
1
:表示每次读取的数据项的大小(以字节为单位)。在这种情况下,每次读取的数据项大小为 1 字节。这意味着fread
函数每次读取的数据项都是一个字节大小。B
:表示要读取的数据项的数量。它是一个整数值,用于指定要从文件中读取多少个数据项。具体的值取决于你的需求和文件中的数据结构。在这个代码片段中,你需要根据实际情况将正确的值赋给B
。
这里的 1
和 B
都是整数值,表示不同的含义。1
是每个数据项的大小,而 B
是要读取的数据项的数量。你需要根据你的需求和数据的结构来确定正确的值。
fread(b, 1, B, fpr):
b:指向要存储读取数据的缓冲区的指针。
1:每个数据项的大小(以字节为单位),在这种情况下是 1 字节。
B:要读取的数据项的数量。
fpr:指向要读取数据的文件的指针。
这个函数调用的意思是从文件中读取 B 个大小为 1 字节的数据项,并将它们存储到 b 所指向的缓冲区中。
fread(b, B, 1, fpr):
b:指向要存储读取数据的缓冲区的指针。
B:要读取的数据项的数量。
1:每个数据项的大小(以字节为单位),在这种情况下是 1 字节。
fpr:指向要读取数据的文件的指针。
这个函数调用的意思是从文件中读取 1 个大小为 B 字节的数据项,并将它们存储到 b 所指向的缓冲区中。
代码示例4:fscanf,fprintf
#include<stdio.h>
#include<stdlib.h>
int main(){
FILE *fpr,*fpw;
char ch;
if((fpr=fopen("hello.c","r"))==NULL)
{
perror("open file error:");
exit(0);
}
if((fpw=fopen("hellocopy4.c","w"))==NULL)
{
perror("open file error:");
exit(0);
}
/*
while(1){
if(fscanf(fpr,"%c",&ch)==EOF)
break;
fprintf(fpw,"%c",ch);
}*/
while(fscanf(fpr,"%c",&ch)!=EOF){
fprintf(fpw,"%c",ch);
}
fclose(fpr);
fclose(fpw);
return 0;
}
主函数参数
int argc ,char * argv[ ]
#include<stdio.h>
#include<stdlib.h>
int main(int argc ,char * argv[]){
FILE *fpr,*fpw;
char ch;
if(a)
if((fpr=fopen("argv[1]","r"))==NULL)
{
perror("open file error:");
exit(0);
}
if((fpw=fopen("argv[2]","w"))==NULL)
{
perror("open file error:");
exit(0);
}
while(fscanf(fpr,"%c",&ch)!=EOF){
fprintf(fpw,"%c",ch);
}
fclose(fpr);
fclose(fpw);
return 0;
}
参数说明:
argc
是用来记录传递给程序的参数的数量 argv
是一个字符串数组,用于存储命令行参数。argv[0]
存储的是程序的名称,而 argv[1]
、argv[2]
等存储的是传递给程序的参数。、
非缓冲文件的文件操作
open
1.作用
打开和创建文件。
2.头文件
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
3.定义函数
int open( const char * pathname, int flags);
int open( const char * pathname,int flags, mode_t mode);
4.参数说明
O_RDONLY 只读模式 O_WRONLY 只写模式 O_RDWR 读写模式 打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的: O_APPEND 每次写操作都写入文件的末尾 O_CREAT 如果指定文件不存在,则创建这个文件 O_EXCL 如果要创建的文件已存在,则返回 -1,并且修改 errno 的值 O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0) O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。 O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O
close
read/write
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
fd为文件描述符;buf表示读出数据缓冲区地址;count表示读出的字节数
lseek
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int filedes, off_t offset, int whence) ;
第一个参数是文件描述符; 第二个参数是偏移量,int型的数,正数是向后偏移,负数向前偏移; 第三个参数是有三个选项: 1.SEEK_SET:将文件指针偏移到传入字节数处(文件头开始偏移) 2.SEEK_CUR:将文件指针偏移到当前位置加上传入字节数处;((当前位置开始偏移) 3.SEEK_END:将文件指针偏移到文件末尾加上传入字节数处(作为拓展作用,必须再执行一次写操作)
fflush
1.作用
更新缓存区。
2.头文件、函数定义
#include<stdio.h>
int fflush(FILE *stream);
3.函数说明
调用fflush()会将缓冲区中的内容写到stream所指的文件中去.若stream为NULL,则会将所有打开的文件进行数据更新。 fflush(stdin):刷新缓冲区,将缓冲区内的数据清空并丢弃。 fflush(stdout):刷新缓冲区,将缓冲区内的数据输出到设备
dup2
1 .头文件和函数原型
#include <unistd.h>
int dup2(int oldfd, int newfd);
2. 参数简介
- oldfd:原来的文件描述符
- newfd:复制成的新的文件描述符
3.函数返回值
- 成功:将oldfd复制给newfd, 两个文件描述符指向同一个文件
- 失败:返回-1, 设置errno值
当调用dup2(int oldfd,int newfd)之后,若newfd原来已经打开了一个文件,则先关闭这个文件,然后newfd和oldfd指向了相同的文件;若newfd原来没有打开一个文件,则newfd直接指向和oldfd指向相同的文件