1. input & output:站在应用层考虑
Input:内核-->用户,从内核读取数据或从文件读取数据 ————read函数
Output:用户-->内核,写数据到内核或写数据到文件中 ————write函数
2. 内核中文件太多了,写到哪个文件,从哪个文件中读呢?这些功能由内核管理,又称文件管理。
因此read/write时需要有参数指定某个文件,而且在read/write之前需要open,创建或打开文件。同时操作完后还要把文件关闭close。
3. open函数
open(char *, flag, mode)在fcntl.h文件中声明。函数的作用:创建或打开某个文件,参数:最多有三个参数;
第一个参数,char * 包含有文件名和路径
第二个参数:flag 打开文件的方式
第三个参数:mode 创建文件的权限。 //在创建文件时需要有权限的参数;如果打开文件,则不需要这个参数Ø flag内容如下:
flag
功能
O_RDONLY
只读
O_WRONLY
只写
O_RDWR
读写
O_CREAT
创建一个文件
O_EXCL
如果使用O_CREAT时文件存在,则可返回错误消息。这一 参数可测试文件是否存在。
O_TRUNC
打开文件(会把已经存在的内容给删除)。
O_APPEND
追加方式打开文件(不会把已经存在的内容给删除)。
Ø 返回值:
成功:文件描述符,它是一个非负的正整数,即文件的ID号,相当于人的身份证号;
出错:-1。
Open 函数创建文件时的权限是:
== mode &(~umask)
B111 111 111& ~(B 000 010 010) = B 111 101 101
4. 文件描述符概述
内核的一个重要功能是文件管理,系统有非常多的文件,内核怎样认识每一个文件呢?内核采用ID号的方式标识这些文件,inode号,node号表示不同的文件,比如ls –lai i,只要文件不一样,inode号就不一样。那么这些内核的文件的ID号,在每个用户的程序中怎样映射的呢?即是文件描述符。
ID号有什么规律呢?从0开始累加,程序进行时(进程),内核会自动打开3个文件描述符,0,1,2,分别对应,标准输入、输出和出错,这样在程序中,每打开一个文件,文件描述符值从3开始累加。
5. close指令
close(fd),
调用close()函数可以关闭一个打开的文件。
调用成功返回0,出错返回-1,并设置errno;
注:当一个进程终止时,该进程打开的所有文件都由内核自动关闭;
6. 实现touch指令
#include "stdio.h"
#include "unistd.h"
#include "fcntl.h"
int main(int argc, char * argv[]){
int fd;
fd = open(argv[1],O_CREAT | O_RDWR, 0777);
if(fd < 0){
printf("create file %s error",argv[1]);
return -1;
}
printf("create file %s success, fd=%s
",argv[1],fd);
close(fd);
return 0;
}