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 技术,为开发者提供了全面的参考资料。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91782.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91782.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91782.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面经——电子电路技术知识详解

电子电路技术知识详解 目录 德摩根定律周期性矩形波产生方法自激振荡器原理与设计晶体管温度效应分析反向饱和电流影响因素放大电路负反馈类型判断正弦波90相移电路直接耦合放大器的缺点二阶有源低通滤波器分析开关电源与线性电源对比 德摩根定律 德摩根定律&#xff08;De …

docker 安装 gitlab

null文章浏览阅读445次。问题&#xff1a;运行 docker run hello-world 报错。原因&#xff1a;原镜像源网络不稳定。https://blog.csdn.net/sszdzq/article/details/145733419 镜像获取 在线下载 docker pull gitlab/gitlab-ce:17.11.1-ce.0 离线获取 创建运行 sudo docke…

PHP中的日期/时间处理之Carbon组件

日常开发中&#xff0c;我们会经常用到日期和时间的操作&#xff0c;但官方的一般操作比较复杂&#xff0c;需要大量的时间进行格式化问题和大量计算等等。Carbon组件 可以帮助我们在 PHP 开发中处理日期/时间变得更加简单、更语义化&#xff0c;从而使得我们的代码更容易阅读和…

学习嵌入式第十八天

文章目录1.数据结构1.概念2.衡量代码质量和效率1.时间复杂度2.空间复杂度3.数据结构分类1.逻辑结构2.存储结构3.常见的数据结构2.链表1.与顺序表的区别2.链表分类1.单向链表1.定义链表节点类型2.空链表的创建3.链表的头插法4.链表的遍历5.链表元素删除3.makefile习题1.数据结构…

基于SpringBoot+Vue实现校园商铺系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

从资源闲置到弹性高吞吐,JuiceFS 如何构建 70GB/s 吞吐的缓存池?

AI 模型的训练与推理对存储系统提出了极为严苛的要求&#xff0c;特别是在高吞吐、高并发以及对海量小文件的高效处理方面&#xff0c;已成为三大主要挑战。尽管基于 Lustre 或 GPFS 的并行文件系统具备出色的性能&#xff0c;但其成本高昂、吞吐能力与容量强耦合&#xff0c;可…

提升JVM性能之CMS垃圾回收器的优化分析与案例剖析

这里写目录标题一、CMS基本介绍二、CMS核心优化策略1. 避免并发模式失败&#xff08;Concurrent Mode Failure&#xff09;2. 减少内存碎片3. 调优并发阶段耗时4. 新生代优化配合三、典型案例解析案例1&#xff1a;电商服务频繁Full GC案例2&#xff1a;金融交易系统碎片导致长…

Token系列 - 再谈稳定币

相关政策 2024年12月&#xff0c;欧洲《加密资产市场监管法案》正式成为法律2025年3月&#xff0c;日本细化了加密资产及稳定币的监管调整2025年5月&#xff0c;英国发布了关于稳定币发行、加密资产托管及加密资产公司财务稳健性的监管提案&#xff1b;2025年5月20日&#xff…

【20min 急速入门】使用Demucs进行音轨分离

创建环境 conda create --name mujica python3.10下载加速依赖 先用nvidia-smi检查机器使用的独显版本, 然后从pytorch官网下载对应的GPU版torch, torchaudio 比如我的是12.2, 就下载11.8版本的 pip3 install torch torchvision torchaudio --index-url https://download.p…

字节Seed发布扩散语言模型,推理速度达2146 tokens/s,比同规模自回归快5.4倍

用扩散模型写代码&#xff0c;不仅像开了倍速&#xff0c;改起来还特别灵活&#xff01;字节Seed最新发布扩散语言模型Seed Diffusion Preview&#xff0c;这款模型主要聚焦于代码生成领域&#xff0c;它的特别之处在于采用了离散状态扩散技术&#xff0c;在推理速度上表现出色…

海洋大地测量基准与水下导航系列之九我国海洋PNT最新技术进展(下)

三、海洋PNT技术装备研发与工程化应用 1.海底基准装备 研制了首批适应海洋环境的多型海底基准站装备&#xff0c;在我国南海海域成功布设了定位精度优于0.25m的海底大地测量试验基准网&#xff0c;实现了我国海底大地测量基准技术零的突破。基准方舱具备稳固、抗压、防腐、防…

入门MicroPython+ESP32:安装逗脑IDE及驱动

本篇文章将手把手带大家入门MicroPython ESP32&#xff0c;重点介绍逗脑IDE的安装过程以及相关驱动的安装。 一、下载逗脑IDE 要开始使用逗脑IDE&#xff0c;首先需要从官网下载最新版本。请访问以下网址进行下载&#xff1a;https://www.itprojects.cn/ide 下载时的界面大…

CentOS上部署Redis及其哨兵(Sentinel)模式

架构&#xff1a;说明我这里是伪集群的&#xff0c;redis 在同一台机器&#xff0c;Sentinel 只有一个&#xff0c;也存在单点故障问题只能当作开发环境使用&#xff0c;要满足生产至少是下面这种架构 ------------------- ------------------- ------------------- …

《软件测试与质量控制》实验报告二 单元测试

目 录 一、实验学时 二、实验目的 三、实验环境 &#xff08;一&#xff09;硬件环境&#xff1a; &#xff08;二&#xff09;软件环境&#xff1a; 四、实验内容 1、实验方案&#xff1a; 2、实验步骤&#xff1a; 3、设计思路&#xff1a; 1、安装JUnit和Eclemma…

k8s模式部署PolarDB-X

当前文档适配PolarDB-X V2.4.0 版本 环境描述&#xff1a; 部署机&#xff08;ops&#xff09;1x2.2x.2x8.116&#xff0c;部署机需要可以访问互联网。使用ansible进行部署&#xff0c;自行安装ansible。需要部署两个k8s集群&#xff0c;分别在其上安装一个polardb-x集群。 部…

Flask + YARA-Python*实现文件扫描功能

以下是一个 完整的 Web API 示例&#xff0c;使用 Flask YARA-Python 实现文件扫描功能&#xff0c;支持上传文件并返回 YARA 规则匹配结果。 ✅ 功能说明 提供一个 /scan 接口&#xff0c;支持文件上传使用预加载的 YARA 规则进行扫描返回 JSON 格式的匹配结果支持多规则、可…

WinForm之NumericUpDown控件

NumericUpDown&#xff08;数字上下控件&#xff09;是 WinForm 中专门用于输入和调整数值的控件&#xff0c;它结合了文本框和上下按钮&#xff0c;用户可通过点击按钮或直接输入来设置数值&#xff0c;且能严格限制数值范围&#xff08;最小值、最大值&#xff09;和步长&…

一文读懂K8S kubectl 命令,运维小白必看!

一、Kubectl 是什么? Kubectl 是 Kubernetes(简称 K8S)集群的命令行工具,它就像是一把万能钥匙,让我们可以与 K8S 集群进行交互,轻松管理集群中的各种资源,像是 Pod、Service、Deployment 等等。通过向 K8S API 发送 REST 请求,kubectl 实现了对集群资源的增删改查等操…

髋臼方向的定义与测量-I

近期看到关于髋臼方向不同应用场景下的不同定义&#xff0c;觉得特别有意思&#xff0c;但是&#xff0c;原文是影印本&#xff0c;不太方便实用屏幕取词翻译&#xff0c;且一些专业术语也不太好理解。 因此&#xff0c;我将原文和翻译整理了一些&#xff0c;不对的地方&#x…

Python爬虫实战:研究mahotas库,构建图像获取及处理系统

一、引言 (一)研究背景 在信息爆炸的时代,图像作为一种直观、丰富的信息载体,其数量在互联网上呈现指数级增长。这些图像数据涵盖了自然景观、动植物、工业产品等多个领域,为模式识别、机器学习等研究提供了宝贵的数据源。特别是在植物学研究领域,叶片图像包含了丰富的…