目录
Linux文件系统简介
Linux和windows的文件系统不同点在于Linux没有盘符之分,只有一个根目录"/",系统结构为树形。Linux支持多种文件系统,不同的文件系统适合不同的用途。
文件分类
在Linux系统中,文件分为:
- 普通文件(-)
- 目录文件(d)
- 符号链接文件(l)
- 字符设备文件(c)
- 块设备文件(b)
- 管道文件(p)
- socket文件(s)
文件有关命令
这里只简略地列举几个命令,详细命令请见Linux常用命令篇
命令名 | 功能 |
---|---|
ls | 查看文件信息 ls -l 以详细信息显示当前目录下的可见文件 |
cat | 连接文件并在标准输出上输出(不可用于目录) 格式:cat [options] file1 file2 … 参数说明: -n 由 1 开始对所有输出的行数编号 |
touch | 创建一个空白文件,如果文件已存在,则会修改文件的时间戳 |
mkdir | 创建一个空目录 |
cd | 修改所处的目录 |
vi/vim | 对文件进行修改,是一个linux下的文档编辑器 |
文件系统常用函数
chmod、umask
函数名 | chmod |
---|---|
头文件 | #include <sys/types.h> #include <sys/stat.h> |
函数功能 | 改变文件权限 |
函数原型 | int chmod(const char* path, mode_t mode) |
返回值 | 改变成功返回0,失败返回-1 |
备注 | 只有文件的所有者以及有效用户识别码为0的用户才可以修改该文件权限 |
mode参数说明(宏的格式为S_I 权限类型 对象)
参数名 | 说明 |
---|---|
S_IRUSR | 所有者具有读取权限 |
S_IWUSR | 所有者具有写入权限 |
S_IXUSR | 所有者具有执行权限 |
S_IRGRP | 组具有读取权限 |
S_IWGRP | 组具有写入权限 |
S_IXGRP | 组具有执行权限 |
S_IROTH | 其他用户具有读取权限 |
S_IWOTH | 其他用户具有写入权限 |
S_IXOTH | 其他用户具有执行权限 |
备注 | USR即user(所有者),GRP即group(组),OTH即other(其他),R是read,W是write,X是execute |
下面这个程序可以看到各个宏定义的具体值
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
int main()
{
printf("%03o\n", S_IRUSR);
printf("%03o\n", S_IWUSR);
printf("%03o\n", S_IXUSR);
printf("%03o\n", S_IRGRP);
printf("%03o\n", S_IWGRP);
printf("%03o\n", S_IXGRP);
printf("%03o\n", S_IROTH);
printf("%03o\n", S_IWOTH);
printf("%03o\n", S_IXOTH);
return 0;
}
输出结果为:(其实就是八进制下的权限码)
400
200
100
040
020
010
004
002
001
函数名 | umask |
---|---|
头文件 | #include <sys/types.h> #include <sys/stat.h> |
函数功能 | 设置建立新文件时的权限掩码 |
函数原型 | mode_t umask(mode_t mask) |
传入值说明 | 4位八进制数(比如0666) |
返回值 | 返回系统原先的mask值 |
备注 | 权限掩码的作用是屏蔽某些权限,建立的新文件权限为0666-mask,建立的新目录权限为0777-mask 即权限掩码设置为0777时,新建立的文件不具有任何权限,权限掩码设置为0000时,新建立的文件具有任何人都可以读写的权限 |
stat
函数名 | stat |
---|---|
头文件 | #include <sys/stat.h> #include <unistd.h> |
函数功能 | 获取文件属性 |
函数原型 | int stat(const char* file_name, struct stat* buf); |
传入值说明 | 将参数file_name所指的文件信息保存到buf指针所指的内存中 |
返回值 | 执行成功返回0,失败返回-1 |
下面是struct stat 的结构:
struct stat
{
mode_t st_mode; //文件对应的模式,文件,目录等
ino_t st_ino; // 索引结点号
dev_t st_dev; //文件所在的设备id
dev_t st_rdev; //设备号,针对设备文件
nlink_t st_nlink; //文件的硬链接数
uid_t st_uid; //文件所有者uid
gid_t st_gid; //文件所有者对应的组gid
off_t st_size; //文件的大小(字节数)
time_t st_atime; //文件最后一次访问的时间
time_t st_mtime; //文件最后一次被修改的时间
time_t st_ctime; //文件属性最后一次被修改的时间
unsigned long st_blksize; //文件内容对应的块大小
unsigned long st_blocks; //文件所占的块数
};
不带缓存的文件I/O操作
不带缓存的文件I/O操作包括系统调用或API的I/O操作,是由操作系统提供的,符合POSIX标准,可以方便地在支持POSIX的系统上进行移植,在嵌入式程序设计、TCP/IP的Socket套接字程序设计、多路IO操作程序设计等方面应用广泛,因此不带缓存的文件I/O操作是Linux文件程序设计的重点。
Windos系统是非POSIX标准的系统,不带缓存的文件I/O操作是无法移植到Windos系统上的
creat
函数名 | creat |
---|---|
头文件 | #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> |
功能 | 创建文件 |
函数原型 | int creat(const char* pathname, mode_t mode) |
传入值说明 | mode参数说明 |
备注 | creat函数用得比较少,因为open函数也可以用于创建文件 |
open、close
函数名 | 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); |
传入值说明 | flags参数说明见下表 mode参数说明 |
返回值 | 成功返回一个最小可用的文件描述符fd,发生错误返回-1 |
备注 | 在Linux系统中前三个文件描述符0, 1, 2 默认为 stdin、stdout、stderr |
flag参数说明:
参数 | 说明 |
---|---|
O_RDONLY | 以只读模式打开 |
O_WRONLY | 以写入模式打开 |
O_RDWR | 以读写模式打开 |
O_APPEND | 以追加模式打开 |
O_TRUNG | 设置文件的长度为0,并舍弃现有的数据 |
O_CREAT | 建立文件,可以配合mode参数设置文件权限 |
O_EXCL | 与O_CREAT一起使用,如果文件已存在,则打开失败 |
函数名 | close |
---|---|
头文件 | #include<unistd.h> |
功能 | 关闭文件 |
函数原型 | int close(int fd) |
返回值 | 成功返回0,发生错误返回-1 |
read、write
函数名 | read |
---|---|
头文件 | #include<unistd.h> |
功能 | 读取文件 |
函数原型 | ssize_t read(int fd, void *buf, size_t count) |
传入值说明 | fd:文件描述符 buf:存入数据的起始位置 count:读取的字节数 |
返回值 | 成功返回读取的字节数,出现错误返回-1 |
备注 | 如果读取成功并且返回值小于count,可能是读到了文件尾 |
函数名 | write |
---|---|
头文件 | #include<unistd.h> |
功能 | 写入文件 |
函数原型 | ssize_t write(int fd, void *buf, size_t count) |
传入值说明 | fd:文件描述符 buf:写入数据的起始位置 count:写入的字节数 |
返回值 | 成功返回写入的字节数,出现错误返回-1 |
备注:read和write对于普通文件是非阻塞的,但是从终端读的话(比如stdin),如果一直没有数据到达,那么read会一直等待,变成阻塞式的。
如果希望非阻塞地从当前终端读取输入,可以参考以下程序:
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
char buf[100];
int cnt = 0, fd