关于常用的6个函数的解析。read、open、close、write、mmap、munmap。

 

read 函数

read 函数用于从文件描述符指定的文件或设备中读取数据。

函数原型
ssize_t read(int fd, void *buf, size_t count);
参数说明
  • int fd

    • 文件描述符,标识要读取的文件或设备。这个文件描述符通常是由 open 函数返回的。
  • void *buf

    • 指向存储读取数据的缓冲区的指针。buf 是一个 void * 类型的指针,表示数据缓冲区的位置。
  • size_t count

    • 要读取的最大字节数。count 是一个 size_t 类型的值,表示从文件中最多读取的字节数。
返回值
  • 成功:返回实际读取的字节数。如果返回值为 0,表示已经到达文件末尾。
  • 失败:返回 -1,并设置 errno 以指示错误原因。

错误码

常见的错误码包括但不限于:

  • EBADF:文件描述符无效。
  • EINTR:读操作被信号中断。
  • EFAULTbuf 指向的地址无效。
  • EIO:输入/输出错误。
  • EINVAL:无效的参数。

open 函数

open 函数用于打开或创建文件,并返回一个文件描述符,该描述符可用于后续的文件操作。

函数原型
int open(const char *pathname, int flags, ... /* mode */);
参数说明
  • const char *pathname

    • 文件路径名,指定要打开或创建的文件。
  • int flags

    • 指定文件打开模式和选项,常见的值有:
      • O_RDONLY:只读模式。
      • O_WRONLY:只写模式。
      • O_RDWR:读写模式。
      • O_CREAT:如果文件不存在,则创建文件。
      • O_EXCL:与 O_CREAT 一起使用,确保文件不存在。
      • O_TRUNC:如果文件已存在,则清空文件。
      • O_APPEND:每次写入时,将数据追加到文件末尾。
  • mode(可选):

    • 如果指定了 O_CREAT,则需要提供第三个参数 mode,指定文件的权限模式,常见的值有:
      • S_IRUSR:所有者可读。
      • S_IWUSR:所有者可写。
      • S_IXUSR:所有者可执行。
      • S_IRGRP:组可读。
      • S_IWGRP:组可写。
      • S_IXGRP:组可执行。
      • S_IROTH:其他人可读。
      • S_IWOTH:其他人可写。
      • S_IXOTH:其他人可执行。
返回值
  • 成功:返回一个非负的文件描述符。
  • 失败:返回 -1,并设置 errno 以指示错误原因。

close 函数

close 函数用于关闭一个文件描述符,释放与之关联的资源。

函数原型
int close(int fd);
参数说明
  • int fd
    • 要关闭的文件描述符。
返回值
  • 成功:返回 0。
  • 失败:返回 -1,并设置 errno 以指示错误原因。

write 函数

write 函数用于将数据写入文件描述符指定的文件或设备。

函数原型
ssize_t write(int fd, const void *buf, size_t count);
参数说明
  • int fd

    • 文件描述符,标识要写入的文件或设备。这个文件描述符通常是由 open 函数返回的。
  • const void *buf

    • 指向要写入的数据缓冲区的指针。buf 是一个 const void * 类型的指针,表示数据缓冲区的内容是只读的。
  • size_t count

    • 要写入的字节数。count 是一个 size_t 类型的值,表示从 buf 中要写入的字节数。
返回值
  • 成功:返回实际写入的字节数。如果返回值为 0,表示没有写入任何数据(这通常意味着文件已经到达末尾或其他特殊情况)。
  • 失败:返回 -1,并设置 errno 以指示错误原因。

错误码

常见的错误码包括但不限于:

  • EBADF:文件描述符无效。
  • EINTR:写操作被信号中断。
  • EFAULTbuf 指向的地址无效。
  • EFBIG:文件超过了最大文件大小限制。
  • ENOSPC:磁盘空间不足。
  • EPIPE:写入已关闭的管道或套接字。

 

mmap 函数

mmap 函数用于将文件或设备映射到内存中,这样可以通过内存访问来读写文件或设备,而不需要使用传统的文件 I/O 操作。

函数原型
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
参数说明
  • void *addr:建议的映射地址。通常设置为 NULL,让内核选择合适的地址。
  • size_t length:要映射的内存区域的长度(以字节为单位)。
  • int prot:指定内存区域的保护标志,常见的值有:
    • PROT_EXEC:允许执行。
    • PROT_READ:允许读取。
    • PROT_WRITE:允许写入。
    • PROT_NONE:不允许访问。
  • int flags:指定映射的类型和其他选项,常见的值有:
    • MAP_SHARED:对内存区域的修改会反映到文件中。
    • MAP_PRIVATE:对内存区域的修改不会反映到文件中,而是创建一个副本。
    • MAP_FIXED:使用指定的地址 addr,如果该地址不可用,则 mmap 失败。
  • int fd:文件描述符,指向要映射的文件或设备。
  • off_t offset:文件中的起始偏移量,必须是页面大小的倍数(通常为4096字节)。
返回值
  • 成功时,返回映射的内存地址。
  • 失败时,返回 MAP_FAILED(通常定义为 (void *)-1),并设置 errno 以指示错误原因。

munmap 函数

munmap 函数用于解除由 mmap 创建的内存映射。

函数原型
int munmap(void *addr, size_t length);
参数说明
  • void *addr:要解除映射的内存区域的起始地址。
  • size_t length:要解除映射的内存区域的长度(以字节为单位)。
返回值
  • 成功时,返回 0。
  • 失败时,返回 -1,并设置 errno 以指示错误原因。

以上如有错误请私信我,包括我其他的文章。

你可能感兴趣的:(数据结构,c语言)