linux所有访问文件
1.C语言中的fopen直接调用open到linux
操作系统
》缓冲——调用lib.c时存在的缓冲——标准I/O库减少了web的读写使用次数
1、全缓冲:所有缓冲区都填满后才进行操作,常规文件全部缓冲
2、输入输出中遇到换行符时执行标准I/O库的操作:允许我们只输入一个字符,当该字符占满一行时输出,通常用于终端设备,比如屏幕
3 无缓冲:用户程序每次调用库函数做写操作时,都必须通过系统调用(如系统调用函数)写回内核。 标准错误输出通常是无缓冲的,以便用户程序生成的错误消息可以尽快输出到设备。
缓冲区验证代码,缓存
空间和用户空间安全
摘要: 学习 Linux 时,常常能够看到两个词:User space(用户空间)和 Kernel space(内核空间)。 简单说,Kernel space 是 Linux 内核的运行空间,User space 是用户程序的运行空间
用户空间和文件操作空间
1.缓冲文件系统和非缓冲系统svg的区别
缓冲文件系统(fopen):为内存中的每个文件开辟一个缓存区域。 执行读操作时,将磁盘文件中的数据读入内存缓冲区,内存缓冲区满后,依次从内存缓冲区中读取数据。 写操作是一样的。
内存缓冲区的大小影响实际外部内存被操作的次数。 缓冲区越大,操作外部存储器的次数就越少,执行速度快、效率高。 缓冲区大小取决于机器。
借助文件结构指针进行文件管理,可以读写字符串、格式化数据和二进制数据。
非缓冲文件系统(开放式):依赖操作系统函数读写文件,不设置文件结构指针,只能读写二进制文件。
2.open属于低级IO,fopen属于高级IO学习
3.open返回一个文件描述符,属于用户态,读写需要在用户态和内核态之间切换。
fopen 返回文件指针 spa
4. open是系统功能,不可移植
fopen是一个标准C函数、可移植操作系统
5.平时用fopen打开普通文件,用open打开设备文件.net
6.如果按顺序访问文件,fopen比open更快
对于随机访问文件,open 比 fopen 更快
系统调用
系统调用就是 Linux 内核提供的一组用户进程与内核进行交互的接口。这些接口让应用程序受限的访问硬件设备,提供了建立新进程并与已有进程进行通讯的机制,也提供了申请操做系统其余资源的能力。 系统调用工做在内核态,实际上,系统调用是用户空间访问内核空间的惟一手段(除异常和陷入外,它们是内核惟一的合法入口)。系统调用的主要做用以下: 1)系统调用为用户空间提供了一种硬件的抽象接口,这样,当须要读写文件时,应用程序就能够不用管磁盘类型和介质,甚至不用去管文件所在的文件系统究竟是哪一种类型; 2)系统调用保证了系统的稳定和安全。做为硬件设备和应用程序之间的中间人,内核能够基于权限、用户类型和其余一些规则对须要进行的访问进行判断; 3)系统调用是实现多任务和虚拟内存的前提。 要访问系统调用,一般经过 C 库中定义的函数调用来进行。它们一般都须要定义零个、一个或几个参数(输入),并且可能产生一些反作用(会使系统的状态发生某种变化)。系统调用还会经过一个 long 类型的返回值来表示成功或者错误。一般,用一个负的值来代表错误,0表示成功。系统调用出现错误时,C 库会把错误码写入 errno 全局变量,经过调用 perror() 库函数,能够把该变量翻译成用户可理解的错误字符串
系统调用函数
int open(const char *path, int 标志)
int open(const char *路径, int 标志, 模式)
头文件:
#include#include #include
范围:
使用 open 系统调用时,准备打开的文件或设备的名字做为参数 path 传递给函数,oflags 参数用于指定打开文件所采起的动做。oflags 参数是经过命令文件访问模式与其余可选模式相结合的方式来指定的,open 调用必须指定如下文件访问模式之一: 1)O_RDONLY:以只读方式打开; 2)O_WRONLY:以只写方式打开; 3)O_RDWR :以读写方式打开。 另外,还有如下几种可选模式的组合( 用按位或 || 来操做 ): 4)O_APPEND:把写入数据追加在文件的末尾; 5)O_TRUNC:把文件长度设置为零,丢弃已有的内容; 6)O_CREAT:若是须要,就按照参数 mode 中给出的访问模式建立文件; 7)O_EXCL:与 O_CREAT 一块儿使用,确保调用者建立出文件。使用这个模式能够防止两个程序同时建立同一个文件,若是文件已经存在,open 调用将失败
当使用 O_CREAT 标志的 open 调用来建立文件时,须要使用有 3 个参数格式的 open 调用。其中,第三个参数 mode 是几个标志按位或后获得的,这些标志在头文件 sys/stat.h 中定义,以下: 标志 说明 标志 说明 标志 说明 S_IRUSR 文件属主可读 S_IRGRP 文件所在组可读 S_IROTH 其余用户可读 S_IWUSR 文件属主可写 S_IWGRP 文件所在组可写 S_IWOTH 其余用户可写 S_IXUSR 文件属主可执行 S_IWOTH 文件所在组可执行 S_IXOTH 其余用户可执行
返回:
成功:返回文件描述符 失败:返回-1
//fd=open("lmj.txt",O_RDonLY|O_CREAT); //fd=open("test.txt",O_WRonLY|O_APPEND); //fd=open("a.txt",O_WRonLY|O_CREAT,0666); //fd=open("mj.txt",O_WRonLY|O_CREAT|O_TRUNC,S_IRWXU); //fd=open("op.txt",O_WRonLY|O_EXCL|0666);
int 关闭(int fd)
头文件:
#include