嵌入式Linux C编程学习之路(七)—— Open/Close函数

2019-07-12 17:26发布

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; }