1. 文件系统
- Windows文件系统与Linux文件系统的差异:
- 文件名分割符不同
Windows:路径名分割符’'。eg:C:\Windows\notepad.exe。
问题:路径分割符与许多编程语言的转义字符相同。eg:在C程序中打开C:\Windows\readme.txt
-> false:fopen(“C:\Windows\readme.txt”, “r”)
-> true:fopen(“C:\Windows\readme.txt”, “r”)
Linux:路径名分割符’/'。eg:/usr/bin/gcc
优势:路径分割符与许多编程语言的转义字符都不同。eg:在C程序中打开/usr/include/stdio.h
-> 直观:fopen(“/usr/include/stdio.h”, “r”)
- 路径结构不同
Windows:盘符 C: + 盘内路径 \Windows\notepad.exe
Linux:绝对路径从唯一的根目录开始,整个系统只有一个根目录’/',没有盘符概念。eg:/usr/bin/gcc
2. 目录管理
- ls:罗列出目录下的所有文件
- pwd:显示当前工作目录
- cd:改变工作目录(进入指定工作目录)
- mkdir:创建目录
- 用户主目录
Linux是一个多用户操作系统,系统中存在多个用户,每一个用户都有一个专属于自己的主目录,用户主目录位于/home目录下,以用户名作为目录名称,通常情况下,用户只能修改自己主目录下的文件。
假如系统中有3个普通用户tom、jerry和guest:
用户tom的主目录为/home/tom
用户jerry的主目录为/home/jerry
用户guest的主目录为/home/guest
在shell中,符号~代表用户的主目录,假设用户的主目录是/home/guest,cd ~的功能与cd /home/guest的功能等价。
命令id显示当前用户名称为cherry,因此用户的主目录为/home/cherry。
3. 文件管理
- touch:创建一个任意类型的空文件
- cat:将文件内容输出到屏幕上
-
cp -r [源文件] [目标文件]:复制文件
-
rm:删除文件和目录
-
mv [源文件] [目标文件]:移动文件到指定目录/更改文件名称
4. 文件系统调用
4.1 打开文件
- 原型
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
- 功能
打开已有的文件:如果打开失败,返回-1;如果打开成功,返回值>=0,作为被打开文件的标识符,该整数被称为文件描述符。
- 参数
pathname,指定文件路径
flags, 指定打开参数,可选的取值如下:
O_RDONLY 以只读方式打开
O_WRONLY 以只写方式打开
O_RDWR 以读写方式打开
O_APPEND 以追加模式打开,写文件时将内容追加文件末尾
O_TRUNC 如果文件存在,将文件的长度截断为0
O_CREAT 如果文件不存在,创建一个新文件
flags的取值可以用位或的方式进行组合
open(“log.txt”, O_RDWR | O_TRUNC);
4.2 创建文件
- 原型
#include <sys/stat.h>
#include <fcntl.h>
int creat(const char *pathname, mode_t mode);
int open(const char *pathname, int flags, mode_t mode);
- 功能
如果文件存在,则打开文件;如果文件不存在,则创建文件。
creat(path, mode) = open(path, O_CREAT|O_WRONLY|O_TRUNC, mode)
- 返回值
如果创建失败,返回-1;如果创建成功,返回值>=0,作为被创建文件的标识符,该整数被称为文件描述符
- 参数
pathname:指定文件路径
flags:指定打开参数,可选的取值与open相同
mode:新建文件的访问模式
4.3 关闭文件
- 原型
#include <unistd.h>
int close(int fd);
- 功能
将打开的文件关闭。操作系统需要为打开的文件分配资源,需要及时关闭不再使用的文件,从而释放相应资源。
- 参数
fd,使用open或者creat打开的文件描述符
4.4 读取文件
- 原型
#include <unistd.h>
int read(int fd, void *buf, size_t count);
- 功能
从打开的文件中读取数据到内存缓冲区。如果读取失败,返回-1;如果读取成功,返回实际读取的字节个数;返回0则代表读取到了文件末尾。
- 参数
fd:使用open或者creat打开的文件描述符
buf:内存缓冲区的起始位置
count:内存缓冲区的长度,read的返回值小于等于count
4.5 写入文件
- 原型
#include <unistd.h>
int write(int fd, void *buf, size_t count);
- 功能
把内存缓冲区的数据写入到打开的文件。如果写入失败,返回-1;如果写入成功,返回实际写入的字节个数。
- 参数
fd, 使用open或者creat打开的文件描述符
buf, 内存缓冲区的起始位置
count, 内存缓冲区的长度,write的返回值小于等于count
5. 作业
- mycat.c
功能:实现cat功能(显示文件内容)
使用说明:
(1) gcc -o mycat mycat.c // 此命令用于将mycat.c编译成可执行文件
(2) ./mycat text // 此命令将text文件中的内容显示到屏幕上
- 代码
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
int main(int argc, char* argv[]){
char *filename;
if(argc < 2)
printf("lack of paramenters");
else if(argc == 2)
filename = argv[1];
else
printf("too many paramenters");
int fd, n;
char buf[BUFSIZ];
fd = open(filename, O_RDONLY);
if(fd == -1)
printf("Open Failed");
else
while((n = read(fd, buf, BUFSIZ)) > 0)
puts(buf);
close(fd);
}
- mycd.c
功能:复制文件(mycd text1 text2 --> 将text1文件内容复制到text2文件中)
使用说明:
(1) gcc -o mycd mycd.c // 将mycd.c编译成可执行文件
(2) ./mycd text file // 将text文件内容复制到file文件中
(3) ./mycat file // 显示文件是否已复制进来
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#define PERMS 0666 // 默认权限
int main(int argc, char *argv[]){
char *filename1, *filename2;
if(argc < 3)
printf("lack of paramenters");
else if(argc == 3){
filename1 = argv[1];
filename2 = argv[2];
}
else
printf("too many paraments");
int fd1, fd2, n;
char buf[BUFSIZ];
fd1 = open(filename1, O_RDONLY);
if(fd1 == -1)
printf("Open %s failed", filename1);
fd2 = creat(filename2, PERMS);
if(fd2 == -1)
printf("Create %s failed", filename2);
while((n = read(fd1, buf, BUFSIZ)) != -1)
if(write(fd2, buf, n) != n)
printf("Write error on file %s", filename2);
close(fd1);
close(fd2);
}