Linux文件I/O:基本概念

Linux是一个开源的操作系统,它提供了一套丰富的文件I/O(输入/输出)接口,让用户和程序可以方便地对文件进行读写操作。文件I/O是操作系统中最基本也最重要的功能之一,它涉及到文件的打开、关闭、读取、写入、定位、锁定等操作。本文将介绍Linux文件I/O的一些基本概念,包括文件描述符、标准输入输出、文件类型、文件权限、文件系统等。

文件描述符

文件描述符(file descriptor)是一个非负整数,它表示一个已打开的文件的引用。每个进程都有一个文件描述符表,用来记录该进程打开的所有文件。当一个进程打开一个文件时,操作系统会分配一个最小的未使用的文件描述符给该文件,并将其加入到文件描述符表中。当一个进程关闭一个文件时,操作系统会释放该文件的文件描述符,并将其从文件描述符表中删除。文件描述符可以用来对文件进行读写操作,也可以用来传递给其他函数或系统调用,例如dup、dup2、fcntl、ioctl等。

文件描述符的分配和释放可以用open和close函数实现,例如:

// 打开一个文件,返回一个文件描述符
int fd = open("test.txt", O_RDONLY); // 以只读方式打开test.txt文件
if (fd == -1) {
    perror("open"); // 如果打开失败,打印错误信息
    exit(1); // 退出程序
}

// 对文件进行读写操作,使用read和write函数
char buf[1024]; // 定义一个缓冲区
int n = read(fd, buf, sizeof(buf)); // 从文件中读取数据到缓冲区
if (n == -1) {
    perror("read"); // 如果读取失败,打印错误信息
    exit(1); // 退出程序
}
printf("Read %d bytes from file: %s\n", n, buf); // 打印读取的数据

// 关闭一个文件,释放一个文件描述符
int ret = close(fd); // 关闭文件
if (ret == -1) {
    perror("close"); // 如果关闭失败,打印错误信息
    exit(1); // 退出程序
}

标准输入输出

每个进程都有三个预定义的文件描述符,分别是标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。它们的文件描述符分别是0、1和2。标准输入通常是键盘,标准输出和标准错误通常是屏幕。这三个文件描述符可以被重定向,也就是说,可以将它们指向其他的文件或设备。例如,可以使用>或>>符号将标准输出或标准错误重定向到一个文件中,或者使用<符号将一个文件作为标准输入。也可以使用管道(|)符号将一个进程的标准输出作为另一个进程的标准输入,实现进程间的通信。

标准输入输出的重定向和管道可以用shell命令实现,例如:

# 将ls命令的标准输出重定向到filelist.txt文件中,覆盖原有内容
ls > filelist.txt

# 将cat命令的标准错误追加到error.log文件中
cat nonexist.txt 2>> error.log

# 将test.txt文件作为wc命令的标准输入,统计文件的行数、单词数和字节数
wc < test.txt

# 将ps命令的标准输出作为grep命令的标准输入,筛选出包含bash的进程
ps | grep bash

文件类型

Linux中的文件可以分为以下几种类型:

  • 普通文件(regular file):这是最常见的文件类型,它包含了一些数据,可以是文本、二进制、图片、音频、视频等。普通文件的文件名可以是任意的,没有特定的后缀名。普通文件可以用cat、cp、mv、rm等命令进行操作。
  • 目录文件(directory file):这是一种特殊的文件,它用来存储其他文件的信息,包括文件名、大小、类型、权限、时间戳等。目录文件可以看作是一个文件的集合,它可以包含其他的目录文件,形成一个层次结构。目录文件的文件名通常以/结尾,表示它是一个目录。目录文件可以用ls、cd、mkdir、rmdir等命令进行操作。
  • 符号链接文件(symbolic link file):这是一种特殊的文件,它用来指向另一个文件或目录,类似于一个快捷方式。符号链接文件的文件名通常以@结尾,表示它是一个链接。符号链接文件可以用ln、readlink等命令进行操作。
  • 设备文件(device file):这是一种特殊的文件,它用来表示一个物理设备,例如硬盘、键盘、鼠标、打印机等。设备文件可以分为两种,一种是字符设备文件(character device file),它表示一个字符流设备,例如键盘、鼠标等。另一种是块设备文件(block device file),它表示一个块存储设备,例如硬盘、光驱等。设备文件的文件名通常以c或b开头,表示它是一个字符设备或块设备。设备文件可以用lsblk、mount、umount等命令进行操作。
  • 套接字文件(socket file):这是一种特殊的文件,它用来表示一个网络连接,例如TCP、UDP、UNIX等。套接字文件可以用来实现进程间或机器间的通信。套接字文件的文件名通常以=开头,表示它是一个套接字。套接字文件可以用netstat、nc、telnet等命令进行操作。
  • 管道文件(pipe file):这是一种特殊的文件,它用来表示一个内存中的缓冲区,可以用来实现进程间的通信。管道文件有两种,一种是命名管道(named pipe),它有一个文件名,可以被多个进程共享。另一种是匿名管道(anonymous pipe),它没有文件名,只能被父子进程共享。管道文件的文件名通常以|开头,表示它是一个管道。管道文件可以用mkfifo、cat、tee等命令进行操作。

文件类型可以用ls -l命令查看,例如:

# 查看当前目录下的所有文件的类型和权限
ls -l
total 16
drwxr-xr-x 2 user user 4096 Nov 23 00:10 dir/ # 目录文件
-rw-r--r-- 1 user user   12 Nov 23 00:10 file # 普通文件
lrwxrwxrwx 1 user user    4 Nov 23 00:10 link -> file # 符号链接文件
prw-r--r-- 1 user user    0 Nov 23 00:10 pipe| # 管道文件
crw-rw-rw- 1 root root 1, 3 Nov 23 00:10 null # 字符设备文件
brw-rw---- 1 root disk 8, 0 Nov 23 00:10 sda # 块设备文件
srwxr-xr-x 1 user user    0 Nov 23 00:10 sock= #套接字文件

文件权限

Linux中的每个文件都有一组权限,用来控制对该文件的访问。文件权限分为三类,分别是用户权限(user permission)、组权限(group permission)和其他权限(other permission)。每类权限又分为三种,分别是读权限(read permission)、写权限(write permission)和执行权限(execute permission)。读权限表示可以读取该文件的内容,写权限表示可以修改该文件的内容,执行权限表示可以运行该文件(如果是可执行文件)。文件权限可以用ls -l、chmod、chown、chgrp等命令进行查看和修改。

文件权限的表示方法有两种,一种是符号表示法(symbolic notation),它用r、w、x分别表示读、写、执行权限,用-表示没有权限,用u、g、o分别表示用户、组、其他,用+、-、=分别表示添加、删除、设置权限。另一种是数字表示法(numeric notation),它用0-7分别表示没有权限、执行权限、写权限、写执行权限、读权限、读执行权限、读写权限、读写执行权限,用三位数字分别表示用户、组、其他的权限。例如:

# 查看当前目录下的所有文件的权限
ls -l
total 16
drwxr-xr-x 2 user user 4096 Nov 23 00:10 dir/ # 目录文件,用户、组、其他都有读写执行权限
-rw-r--r-- 1 user user   12 Nov 23 00:10 file # 普通文件,用户有读写权限,组、其他只有读权限
lrwxrwxrwx 1 user user    4 Nov 23 00:10 link -> file # 符号链接文件,用户、组、其他都有读写执行权限
prw-r--r-- 1 user user    0 Nov 23 00:10 pipe| # 管道文件,用户有读写权限,组、其他只有读权限
crw-rw-rw- 1 root root 1, 3 Nov 23 00:10 null # 字符设备文件,用户、组、其他都有读写权限
brw-rw---- 1 root disk 8, 0 Nov 23 00:10 sda # 块设备文件,用户、组有读写权限,其他没有权限
srwxr-xr-x 1 user user    0 Nov 23 00:10 sock= # 套接字文件,用户有读写执行权限,组、其他只有执行权限

# 修改file文件的权限,使用户、组、其他都有读写权限,使用符号表示法
chmod ugo+rw file

# 修改dir目录的权限,使用户有读写执行权限,组有读执行权限,其他没有任何权限,使用数字表示法
chmod 740 dir

文件系统

Linux中的文件系统是一种用来组织和管理文件的方式,它定义了文件的存储、访问和操作的规则。Linux支持多种文件系统,例如ext2、ext3、ext4、xfs、btrfs、fat、ntfs等。每种文件系统都有自己的特点和优缺点,例如性能、可靠性、兼容性等。文件系统可以用mkfs、fsck、mount、umount等命令进行创建、检查、挂载和卸载。

文件系统的创建可以用mkfs命令实现,它可以指定文件系统的类型、大小、标签等参数,例如:

# 创建一个ext4类型的文件系统,大小为1G,标签为data,分配给/dev/sdb1分区
mkfs -t ext4 -L data -b 1024 /dev/sdb1

文件系统的检查可以用fsck命令实现,它可以检测和修复文件系统的错误,例如:

# 检查并修复/dev/sdb1分区的文件系统,使用交互模式,询问用户是否修复
fsck -t ext4 -r /dev/sdb1

文件系统的挂载可以用mount命令实现,它可以将一个文件系统关联到一个目录,使之可以被访问,例如:

# 挂载/dev/sdb1分区的文件系统到/mnt/data目录,使用默认选项
mount /dev/sdb1 /mnt/data

文件系统的卸载可以用umount命令实现,它可以将一个文件系统和一个目录解除关联,使之不再被访问,例如:

# 卸载/mnt/data目录的文件系统,使用默认选项
umount /mnt/data

 

你可能感兴趣的:(LINUX应用编程,linux,服务器,运维)