man手册
查找命令:man 2 open//man read//man 2 write
操作:f-往前翻 b-往后翻 q-退出
tip:Linux下有3大帮助方法(help man info)
标准接口(open/read/write)的使用:
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> //头文件使用man手册查找 /* * ./copy 1.txt 2.txt * argc = 3 * argv[0] = "./copy" * argv[1] = "1.txt" * argv[2] = "2.txt" */ int main(int argc, char **argv) { int fd_old, fd_new; char buf[1024]; int len; 1.判断参数 if (argc != 3) { printf("Usage: %s <old-file> <new-file>\n", argv[0]); return -1; } 2.打开老文件 fd_old = open(argv[1], O_RDONLY); if (fd_old == -1) { printf("can not open file %s\n", argv[1]); return -1; } 3.创建新文件 fd_new = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | _IROTH | S_IWOTH); //S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | _IROTH | S_IWOTH是给复制文件添加操作权限 if (fd_new == -1) { printf("can not creat file %s\n", argv[2]); return -1; } 4.循环:读老文件-写新文件 while ((len = read(fd_old, buf, 1024)) > 0) { if (write(fd_new, buf, len) != len) { printf("can not write %s\n", argv[2]); return -1; } } 5.关闭文件 close(fd_old); close(fd_new); return 0; }
应用态:使用标准接口open/read/write
内核态:根据传入参数触发sys_open/sys_read/sys_write
应用程序调用标准接口进入内核流程:
内核中的sys_open操作需要分辨文件类型
普通文件:使用FAT32/EXT4/其他格式的文件系统驱动代码来打开文件;
文件保存在块设备,会找到块设备驱动程序;
字符设备节点:根据主设备号在内核中找到驱动;