欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

open/read/write/close等文件相关系统调用接口

程序员文章站 2022-07-14 17:35:22
...

1、系统调用
操作系统会对外表现为一个整体,但是会暴露自己的部分接口,这由操作系统提供的部分接口,称为系统调用。
2、库函数
系统调用进行适度封装,从而形成了库,有利于开发者进行二次开发。
下面我们就来解释系统函数与库函数的关系:
在下面这张图我们可以看到操作系统在底层软硬件的分层结构,同时观察到lib库函数所在与系统调用的关系,显然他们是上下级的关系,lib是对系统调用的二次封装,方便二次开发。
open/read/write/close等文件相关系统调用接口
今天我们就来认识下一些文件相关的系统函数
open、close、write、read等被称为无缓冲I/O(Unbuffered I/O)函数,用户程序在读写文件时既可以调用c标准库函数,也可以直接调用底层的Unbuffered I/O函数。
然而open、close、write、read等系统的函数成为无缓冲I/O函数,那么这些函数的各自的使用场景是什么呢?

  • 用Unbuffered I/O函数每次读写都要进内核,调一个系统调用比调一个用户控件的函数要慢很多,所以在用户程序开辟I/O缓冲区还是必要的,用C标准I/O库函数比较方便。
  • 用C标准I/O库函数要时刻注意I/O缓冲区和实际文件有可能不一致,在必要时调用fflush(3)。
  • UNIX的传统是Everything is a file(一切皆文件),I/O函数不仅可以读写文件还可以读写设备。在读写设备时通常是不希望有缓冲的。比如网络设置的读写就希望是实时读写。
  • C标准库函数是C标准的一部分,而Unbuffered I/O函数是UNIX标准的一部分。只有在UNXI平台上才能用Unbuffered I/O函数,windows上不行。

1. open
open/read/write/close等文件相关系统调用接口
注释:

1)函数说明:用来打开一个一个已经存在的文件或者用来创建一个普通文件。
2)参数解释:
pathname:文件名
flags:打开文件的方法
mode:若文件不存在,设置新文件的权限
返回值:成功则返回文件描述符,否则返回-1
对于open函数来说,第三个参数仅当创建新文件时(即使用了O_CREAT 时)才使用,用于指定文件的访问权限位。
3) 返回值:成功则返回文件描述符,否则返回-1

flags 用于指定文件的打开/创建模式,这个参数可由以下常量(定义于fcntl.h)通过逻辑位或逻辑构成。

O_RDONLY 只读模式
O_WRONLY 只写模式
O_RDWR 读写模式。
2)flags:

打开/创建文件时,至少得使用上述三个常量中的一个。
以下常量是选用的:

O_APPEND 每次写操作都写入文件的末尾 O_CREAT 如果指定文件不存在,则创建这个文件 O_EXCL
如果要创建的文件已存在,则返回-1,并且修改errno的值 O_TRUNC
如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0) O_NOCTTY
如果路径名指向终端设备,不要把这个设备用作控制终端。 O_NONBLOCK
如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继I/O

2、close
open/read/write/close等文件相关系统调用接口
注释:
(1)函数说明:关闭指定文件
(2)函数解释:fd—–文件描述符,用来指向要操作的文件的文件结构体
(3)返回值:若成功返回0,失败返回-1;
注意:关闭一个文件时也释放该进程加在该文件上的所有记录锁,当一个进程终止时,它所有的打开文件都由内核自动关闭。
3、read函数
open/read/write/close等文件相关系统调用接口
注释:
(1)函数说明:是从 fd所描述的打开文件中读取 buf所指缓冲区中的 n个字节。
(2)参数说明
fd:文件描述符,用来指向要操作的文件的文件结构体
buf:一块内存空间
count:请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。
ssize_t:有符号整型
(3)返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调用read之前已到达文件末尾,则这次read返回0。
注意:读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读的字数

#include <stdio.h>
  2 #include <unistd.h>
  3 
  4 int main(){
  5     char buf[1024];
  6     ssize_t s=read(0,buf,sizeof(buf)-1);
  7     //从屏幕上读取数据,包括换行符
  8      printf("%d\n",sizeof(buf)-1);
  9      printf("s=%d\n",s);
 10      buf[s]=0;
 11      printf("%d\n",strlen(buf));
 12      printf("%d\n",sizeof(buf));
 13      return 0;
 14 }           

open/read/write/close等文件相关系统调用接口

read时如果fd中的数据小于要读取的数据,就会引起堵塞,可以添加换行符)(回车)就不会引起堵塞了。从终端设备读,通常以行为单位,读到换行符就返回,换行符也算读到的内容。

4、write
open/read/write/close等文件相关系统调用接口
注释:
(1)函数说明:将buf所指向的缓冲区的n字节写入fd所描述的打开文件中
(2)参数说明:
fd文件指针
作用: 把buf中的nbyte大小的数据写入fd
返回值: 写入文档的字节数(成功);-1(出错)
write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.