所需头文件

在编写相关代码时,请确保包含以下头文件:

#include <sys/types.h>  // 提供基本数据类型定义(如 off_t, mode_t 等)
#include <sys/stat.h>   // 提供文件属性及 open() 函数的 mode 参数宏定义
#include <fcntl.h>      // 提供 open() 函数的 flags 参数宏定义及 fcntl()
#include <unistd.h>     // 提供 POSIX 标准系统调用(如 read, write, lseek, dup 等)

1. open(const char *pathname, int flags, mode_t mode)

open作用: 打开或创建一个文件,将路径名转换为一个文件描述符(非负小整数),用于后续的read、write等I/O操作。

参数含义与用法:

  • pathname:要打开或创建的文件路径名。
  • flags:通过按位或(|)组合的标志,指定文件的访问模式和可选模式。
    • 访问模式:O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)。
    • 可选模式:O_CREAT(文件不存在则创建)、O_TRUNC(若文件存在且可写,则清空文件内容)、O_APPEND(以追加模式打开,每次写入前光标移至文件末尾)、O_NONBLOCK(非阻塞模式打开)。
  • mode:仅在flags包含O_CREAT时有效。用于指定新创建文件的初始权限(如0644, 0666等)。

返回值:

  • 成功:返回当前进程中最小的未使用文件描述符。
  • 失败:返回 -1,并设置errno以指示错误类型。

代码展示:


2. write(int fd, const void *buf, size_t count)

write作用: 将数据从用户缓冲区写入到指定的文件描述符中,适用于普通文件、管道、套接字等。

参数含义与用法:

  • fd:文件描述符,表示数据写入的目标。
  • buf:指向包含待写入数据的缓冲区的指针。
  • count:期望写入的字节数。

返回值:

  • 成功:返回实际写入的字节数(可能小于count,例如磁盘已满或向管道/套接字写入时)。
  • 失败:返回 -1,并设置errno

3. read(int fd, void *buf, size_t count)

read作用: 从指定的文件描述符中读取数据,并将其存入用户提供的缓冲区中。

参数含义与用法:

  • fd:文件描述符,表示读取数据的来源。
  • buf:指向用户分配缓冲区的指针,用于存储读取的数据。
  • count:期望读取的最大字节数。

返回值:

  • 成功:返回实际读取到的字节数。若返回0,表示已到达文件末尾(EOF)。
  • 失败:返回 -1,并设置errno

代码展示 :


4. freopen(const char *filename, const char *mode, FILE *stream)

freopen作用: C标准库函数,用于关闭当前与流关联的文件,并将该流重新分配(重定向)到指定的新文件。常用于重定向标准输入/输出流。

参数含义与用法:

  • filename:要重定向到的目标文件名或路径。
  • mode:文件的访问模式字符串(如"r"只读、"w"只写、"a"追加)。
  • stream:需要被重定向的标准流指针(如stdinstdoutstderr)。

返回值:

  • 成功:返回指向新打开流的FILE *指针(即传入的stream)。
  • 失败:返回NULL,并设置errno

代码展示:

注:/dev/tty表示的是终端


5. fcntl(int fd, int cmd, ... /* arg */)

fcntl作用: 对已打开的文件描述符进行多种控制操作,具体行为由cmd参数决定。

参数含义与用法:

  • fd:要操作的文件描述符。
  • cmd:要执行的命令。常用命令包括:
    • F_GETFL:获取文件状态标志(如O_NONBLOCK),无需第三个参数。
    • F_SETFL:设置文件状态标志,需要第三个参数(新的标志值)。
  • ...:可选参数,取决于cmd的值。

返回值:

  • 返回值取决于cmd。例如,F_GETFL成功时返回当前的标志位;F_SETFL成功时返回0;失败时均返回 -1 并设置errno

代码展示:


6. dup(int oldfd)

dup作用: 复制一个现有的文件描述符,返回一个新的文件描述符,两者指向同一个文件表项。

参数含义与用法:

  • oldfd:需要被复制的源文件描述符。

返回值:

  • 成功:返回当前进程中最小的未使用文件描述符。新旧描述符共享读写指针、文件状态标志和锁定等。
  • 失败:返回 -1,并设置errno

代码展示:


7. dup2(int oldfd, int newfd)

dup2作用: 复制文件描述符,并将结果精确绑定到用户指定的目标文件描述符上,常用于实现I/O重定向。

参数含义与用法:

  • oldfd:需要被复制的源文件描述符。
  • newfd:指定的目标文件描述符。如果newfd已经打开,系统会先自动关闭它;如果newfd == oldfd,则直接返回newfd,不做任何操作。

返回值:

  • 成功:返回目标文件描述符newfd
  • 失败:返回 -1,并设置errno(如oldfd无效时,newfd不会被关闭)。

代码展示:


8. lseek(int fildes, off_t offset, int whence)

lseek作用: 移动已打开文件的读写位置(文件指针),以便后续的read/write操作从新位置开始。

参数含义与用法:

  • fildes:已打开的文件描述符。
  • offset:相对于基准位置的偏移字节数。
  • whence:基准位置,常用宏定义包括:
    • SEEK_SET:从文件开头计算。
    • SEEK_CUR:从当前读写位置计算。
    • SEEK_END:从文件末尾计算。

返回值:

  • 成功:返回移动后距离文件开头的字节偏移量。
  • 失败:返回 -1,并设置errno(如对不可定位的设备如tty进行lseek操作会返回ESPIPE)。

代码展示:

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐