Linux I/O 函数完整清单
1. 基础 I/O 函数
1.1 基本读写
#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
1.2 位置指定读写
#include <unistd.h>ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
1.3 文件位置操作
#include <unistd.h>
#include <sys/types.h>off_t lseek(int fd, off_t offset, int whence);
2. 分散/聚集 I/O 函数
2.1 基本分散/聚集
#include <sys/uio.h>ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
2.2 位置指定分散/聚集
#include <sys/uio.h>ssize_t preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);
ssize_t pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset);
2.3 增强版分散/聚集
#define _GNU_SOURCE
#include <sys/uio.h>ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);
ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags);
3. 文件控制函数
3.1 文件描述符控制
#include <fcntl.h>int fcntl(int fd, int cmd, ... /* arg */);
3.2 文件操作
#include <fcntl.h>
#include <sys/stat.h>int open(const char *pathname, int flags, ...);
int openat(int dirfd, const char *pathname, int flags, ...);
int creat(const char *pathname, mode_t mode);
int close(int fd);
3.3 文件状态
#include <sys/stat.h>int stat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);
int fstatat(int dirfd, const char *pathname, struct stat *statbuf, int flags);
4. 高级 I/O 函数
4.1 内存映射 I/O
#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);
int msync(void *addr, size_t length, int flags);
4.2 异步 I/O
#include <aio.h>int aio_read(struct aiocb *aiocbp);
int aio_write(struct aiocb *aiocbp);
int aio_error(const struct aiocb *aiocbp);
ssize_t aio_return(struct aiocb *aiocbp);
int aio_suspend(const struct aiocb *const aiocb_list[], int nitems,const struct timespec *timeout);
4.3 Linux AIO (系统调用级别)
#include <linux/aio_abi.h>
#include <sys/syscall.h>int io_setup(unsigned nr_events, aio_context_t *ctxp);
int io_destroy(aio_context_t ctx);
int io_submit(aio_context_t ctx, long nr, struct iocb **iocbpp);
int io_getevents(aio_context_t ctx, long min_nr, long nr,struct io_event *events, struct timespec *timeout);
4.4 io_uring (现代异步 I/O)
#include <liburing.h>int io_uring_queue_init(unsigned entries, struct io_uring *ring, unsigned flags);
int io_uring_queue_exit(struct io_uring *ring);
int io_uring_submit(struct io_uring *ring);
int io_uring_wait_cqe(struct io_uring *ring, struct io_uring_cqe **cqe);
5. 目录操作函数
5.1 目录遍历
#include <dirent.h>DIR *opendir(const char *name);
DIR *fdopendir(int fd);
struct dirent *readdir(DIR *dirp);
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
int closedir(DIR *dirp);
void rewinddir(DIR *dirp);
long telldir(DIR *dirp);
void seekdir(DIR *dirp, long loc);
5.2 目录创建/删除
#include <sys/stat.h>
#include <unistd.h>int mkdir(const char *pathname, mode_t mode);
int mkdirat(int dirfd, const char *pathname, mode_t mode);
int rmdir(const char *pathname);
6. 文件系统函数
6.1 文件系统操作
#include <sys/statvfs.h>
#include <sys/vfs.h>int statvfs(const char *path, struct statvfs *buf);
int fstatvfs(int fd, struct statvfs *buf);
int statfs(const char *path, struct statfs *buf);
int fstatfs(int fd, struct statfs *buf);
6.2 文件系统控制
#include <sys/mount.h>int mount(const char *source, const char *target,const char *filesystemtype, unsigned long mountflags,const void *data);
int umount(const char *target);
int umount2(const char *target, int flags);
7. 符号链接和特殊文件
7.1 符号链接操作
#include <unistd.h>ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
ssize_t readlinkat(int dirfd, const char *pathname, char *buf, size_t bufsiz);
int symlink(const char *target, const char *linkpath);
int symlinkat(const char *target, int newdirfd, const char *linkpath);
7.2 特殊文件操作
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/sysmacros.h>int mknod(const char *pathname, mode_t mode, dev_t dev);
int mknodat(int dirfd, const char *pathname, mode_t mode, dev_t dev);
8. 扩展属性函数
8.1 扩展属性操作
#include <sys/xattr.h>ssize_t getxattr(const char *path, const char *name, void *value, size_t size);
ssize_t lgetxattr(const char *path, const char *name, void *value, size_t size);
ssize_t fgetxattr(int fd, const char *name, void *value, size_t size);ssize_t listxattr(const char *path, char *list, size_t size);
ssize_t llistxattr(const char *path, char *list, size_t size);
ssize_t flistxattr(int fd, char *list, size_t size);int setxattr(const char *path, const char *name, const void *value,size_t size, int flags);
int lsetxattr(const char *path, const char *name, const void *value,size_t size, int flags);
int fsetxattr(int fd, const char *name, const void *value,size_t size, int flags);int removexattr(const char *path, const char *name);
int lremovexattr(const char *path, const char *name);
int fremovexattr(int fd, const char *name);
9. 管道和 FIFO
9.1 管道操作
#include <unistd.h>int pipe(int pipefd[2]);
int pipe2(int pipefd[2], int flags);
9.2 FIFO 操作
#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);
int mkfifoat(int dirfd, const char *pathname, mode_t mode);
10. 套接字 I/O 函数
10.1 基本套接字操作
#include <sys/socket.h>ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
10.2 高级套接字操作
#include <sys/socket.h>int socket(int domain, int type, int protocol);
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
int listen(int sockfd, int backlog);
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
11. 网络 I/O 多路复用
11.1 传统多路复用
#include <sys/select.h>int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);
11.2 现代多路复用
#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);
int ppoll(struct pollfd *fds, nfds_t nfds,const struct timespec *timeout_ts, const sigset_t *sigmask);
11.3 Linux 特有多路复用
#include <sys/epoll.h>int epoll_create(int size);
int epoll_create1(int flags);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);
int epoll_pwait(int epfd, struct epoll_event *events,int maxevents, int timeout,const sigset_t *sigmask);
12. 文件锁定函数
12.1 文件锁定
#include <fcntl.h>int flock(int fd, int operation);
int fcntl(int fd, int cmd, ... /* arg */);
13. 缓冲 I/O 函数 (标准库)
13.1 标准 I/O
#include <stdio.h>FILE *fopen(const char *pathname, const char *mode);
FILE *freopen(const char *pathname, const char *mode, FILE *stream);
FILE *fdopen(int fd, const char *mode);
int fclose(FILE *stream);size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int fputs(const char *s, FILE *stream);int fseek(FILE *stream, long offset, int whence);
long ftell(FILE *stream);
void rewind(FILE *stream);
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, const fpos_t *pos);
14. 内存操作函数
14.1 内存操作
#include <string.h>void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);
void *memset(void *s, int c, size_t n);
int memcmp(const void *s1, const void *s2, size_t n);
15. 实用示例程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include <errno.h>// 演示不同 I/O 函数的使用
void demonstrate_io_functions() {printf("=== Linux I/O 函数分类演示 ===\n\n");// 1. 基础 I/Oprintf("1. 基础 I/O 函数:\n");printf(" - read/write: 基本读写操作\n");printf(" - pread/pwrite: 位置指定读写\n");printf(" - lseek: 文件位置操作\n\n");// 2. 分散/聚集 I/Oprintf("2. 分散/聚集 I/O 函数:\n");printf(" - readv/writev: 基本分散/聚集\n");printf(" - preadv/pwritev: 位置指定分散/聚集\n");printf(" - preadv2/pwritev2: 增强版分散/聚集\n\n");// 3. 文件控制printf("3. 文件控制函数:\n");printf(" - open/close: 文件打开/关闭\n");printf(" - fcntl: 文件描述符控制\n");printf(" - stat/fstat: 文件状态获取\n\n");// 4. 高级 I/Oprintf("4. 高级 I/O 函数:\n");printf(" - mmap/munmap: 内存映射 I/O\n");printf(" - aio_*: 异步 I/O\n");printf(" - io_uring: 现代异步 I/O\n\n");// 5. 目录操作printf("5. 目录操作函数:\n");printf(" - opendir/readdir: 目录遍历\n");printf(" - mkdir/rmdir: 目录创建/删除\n\n");// 6. 文件系统printf("6. 文件系统函数:\n");printf(" - statvfs: 文件系统状态\n");printf(" - mount: 文件系统挂载\n\n");// 7. 特殊文件printf("7. 特殊文件函数:\n");printf(" - mknod: 创建特殊文件\n");printf(" - symlink: 创建符号链接\n\n");// 8. 扩展属性printf("8. 扩展属性函数:\n");printf(" - getxattr/setxattr: 获取/设置扩展属性\n");printf(" - listxattr: 列出扩展属性\n\n");// 9. 管道和套接字printf("9. 管道和套接字函数:\n");printf(" - pipe: 创建管道\n");printf(" - socket: 创建套接字\n");printf(" - send/recv: 套接字 I/O\n\n");// 10. 多路复用printf("10. I/O 多路复用函数:\n");printf(" - select: 传统多路复用\n");printf(" - poll: 现代多路复用\n");printf(" - epoll: Linux 特有多路复用\n\n");
}// 创建测试文件
int create_test_file(const char *filename) {int fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0644);if (fd == -1) {perror("创建测试文件失败");return -1;}const char *content = "Hello, Linux I/O Functions!\n这是一个测试文件。\n";ssize_t bytes_written = write(fd, content, strlen(content));if (bytes_written == -1) {perror("写入测试文件失败");close(fd);return -1;}printf("创建测试文件: %s (%zd 字节)\n", filename, bytes_written);close(fd);return 0;
}// 演示文件操作函数族
void demonstrate_file_operations() {const char *test_file = "io_functions_test.txt";printf("=== 文件操作函数族演示 ===\n\n");// 创建测试文件if (create_test_file(test_file) == -1) {return;}// 1. 基本文件操作printf("1. 基本文件操作:\n");int fd = open(test_file, O_RDONLY);if (fd != -1) {char buffer[100];ssize_t bytes_read = read(fd, buffer, sizeof(buffer) - 1);if (bytes_read != -1) {buffer[bytes_read] = '\0';printf(" read: %s", buffer);}close(fd);}// 2. 位置指定操作printf("\n2. 位置指定操作:\n");fd = open(test_file, O_RDONLY);if (fd != -1) {char buffer[50];ssize_t bytes_read = pread(fd, buffer, sizeof(buffer) - 1, 10);if (bytes_read != -1) {buffer[bytes_read] = '\0';printf(" pread (从位置10开始): %s", buffer);}close(fd);}// 3. 文件状态获取printf("\n3. 文件状态获取:\n");struct stat file_stat;if (stat(test_file, &file_stat) == 0) {printf(" stat: 文件大小 %ld 字节\n", (long)file_stat.st_size);printf(" 修改时间 %s", ctime(&file_stat.st_mtime));}// 4. 扩展属性操作printf("\n4. 扩展属性操作:\n");fd = open(test_file, O_RDWR);if (fd != -1) {const char *attr_name = "user.test_attr";const char *attr_value = "test_value";// 设置扩展属性if (fsetxattr(fd, attr_name, attr_value, strlen(attr_value), 0) == 0) {printf(" fsetxattr: 成功设置扩展属性\n");// 获取扩展属性char value_buffer[50];ssize_t attr_size = fgetxattr(fd, attr_name, value_buffer, sizeof(value_buffer) - 1);if (attr_size != -1) {value_buffer[attr_size] = '\0';printf(" fgetxattr: %s = %s\n", attr_name, value_buffer);}}close(fd);}// 5. 内存映射printf("\n5. 内存映射操作:\n");fd = open(test_file, O_RDONLY);if (fd != -1) {struct stat sb;if (fstat(fd, &sb) == 0) {void *mapped = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);if (mapped != MAP_FAILED) {printf(" mmap: 成功映射 %ld 字节\n", (long)sb.st_size);printf(" 内容: %.50s...\n", (char*)mapped);munmap(mapped, sb.st_size);}}close(fd);}// 清理unlink(test_file);
}int main() {printf("=== Linux I/O 函数完整清单 ===\n\n");// 演示 I/O 函数分类demonstrate_io_functions();// 演示文件操作函数族demonstrate_file_operations();printf("\n=== I/O 函数选择指南 ===\n");printf("选择原则:\n");printf("1. 简单读写 -> read/write\n");printf("2. 位置指定 -> pread/pwrite\n");printf("3. 多缓冲区 -> readv/writev\n");printf("4. 高性能 -> mmap/io_uring\n");printf("5. 异步操作 -> aio_*/io_uring\n");printf("6. 高并发 -> epoll\n");printf("7. 资源限制 -> prlimit64\n");printf("8. 扩展属性 -> *xattr 函数族\n");return 0;
}
编译和运行说明
# 编译示例程序
gcc -o io_functions_demo demo.c# 运行示例
./io_functions_demo# 查看系统支持的 I/O 函数
man 2 read # 查看 read 系统调用手册
man 2 pread # 查看 pread 系统调用手册
man 7 aio # 查看异步 I/O 手册
man 7 epoll # 查看 epoll 手册
系统要求检查
# 检查内核版本
uname -r# 检查 glibc 版本
ldd --version# 检查系统调用支持
grep -E "(io_uring|aio|mmap)" /usr/include/asm/unistd_64.h# 查看文件系统支持
cat /proc/filesystems
这个完整的清单涵盖了 Linux 系统中所有的 I/O 相关函数,从最基本的读写操作到最先进的异步 I/O 技术,为开发者提供了全面的参考资料。