C高级:Linux/Unix 核心系统调用与标准IO函数的学习记录
·
所需头文件
在编写相关代码时,请确保包含以下头文件:
#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:需要被重定向的标准流指针(如
stdin、stdout、stderr)。
返回值:
- 成功:返回指向新打开流的
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)。
代码展示:

更多推荐




所有评论(0)