文件IO
Linux系统的文件有哪些
Linux 的文件既可以是真实保存到存储介质的文件也可以是自身内核提供的虚拟文件,还可以是设备节点 。
访问文件的方式
Linux下的帮助方法
man的9大分类:
1 Executable programs or shell commands // 命令
2 System calls (functions provided by the kernel) // 系统调用,比如 man 2 open
3 Library calls (functions within program libraries) // 函数库调用
4 Special files (usually found in /dev) // 特殊文件, 比如 man 4 tty
5 File formats and conventions eg /etc/passwd // 文件格式和约定, 比如 man 5 passwd
6 Games // 游戏
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7) //杂项
8 System administration commands (usually only for root) // 系统管理命令
9 Kernel routines [Non standard] // 内核例程
系统调用怎么进入内核以及内核的 sys_open、 sys_read 会做什么
详见《完全开发手册》P171-P172
文件IO的常用函数(可通过man方法获取更多细节)
标准IO方式:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
/**
* argv[1]:新文件
* argv[2]:旧文件
**/
int main(int argc, char **argv)
{
int fd_old, fd_new;
char data[1024]; //1024个字节为一组
int len;
/*格式提醒*/
if(argc != 3) {
printf("Usage: %s <old-file> <new-file>\n", argv[0]);
return -1;
}
/* 1.打开文件 */
fd_old = open(argv[2], O_RDONLY);
if(fd_old == -1) {
printf("can not open file %s\n", argv[2]); //打开文件失败
return -1;
}
/* 2.创建新文件 */
fd_new = open(argv[1], O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if(fd_new == -1) {
printf("can not creat file %s\n", argv[1]);
return -1;
}
/* 3.读取旧文件,写入新文件 */
while((len = read(fd_old, data, 1024)) > 0) {
if(write(fd_new, data, len) != len) {
printf("can not wite file %s\n", argv[2]);
return -1;
}
}
/* 4.关闭文件 */
close(fd_old);
close(fd_new);
return 0;
}
非通用IO(mmap):
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
int main(int argc, char **argv) {
int fd_old, fd_new;
struct stat stat;
char *ptr; //内存映射的起始地址
/* 1.判断指令 */
if(argc != 3) {
printf("Usage: %s <new-file> <old-file>\n", argv[0]);
return -1;
}
/* 2.打开旧文件 */
fd_old = open(argv[2], O_RDONLY);
if(fd_old == -1) {
printf("can not open %s\n", argv[2]);
return -1;
}
/* 3.获取文件长度 */
if(fstat(fd_old, &stat) == -1) { //获取文件信息
printf("can not get stat of %s\n", argv[2]);
return -1;
}
/* 4.映射旧文件 */
ptr = mmap(NULL, stat.st_size, PROT_READ, MAP_SHARED, fd_old, 0);
if(ptr == MAP_FAILED) {
printf("can not mmap file %s\n", argv[2]);
return -1;
}
/* 5.创建新文件 */
fd_new = open(argv[1], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if(fd_new == -1) {
printf("can not creat file %s\n", argv[2]);
return -1;
}
/* 6.写新文件 */
if(write(fd_new, ptr, stat.st_size) != stat.st_size) {
printf("can not write %s\n", argv[1]);
return -1;
}
/* 7.关闭文件 */
close(fd_new);
close(fd_old);
return 0;
}