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\n",argv[1],fd);

close(fd);

return 0;

}

Logo

更多推荐