Linux_API_大全.pdf
### Linux API 大全知识点概览 #### 一、Linux VFS(虚拟文件系统) Linux VFS 是一个抽象层,它允许不同的文件系统共享一组通用的接口和数据结构,从而支持多种不同的文件系统类型。 ##### 目录缓存管理 **d_invalidate:** - **功能:** 用于清理目录项缓存中的某个条目。 - **应用场景:** 当目录项不再有效或需要更新时使用此函数来刷新缓存。 **d_find_alias:** - **功能:** 查找给定别名的目录项。 - **应用场景:** 在处理符号链接等场景时非常有用。 **prune_dcache:** - **功能:** 剪枝目录缓存,释放内存。 - **应用场景:** 当系统内存紧张时,可以调用该函数来释放部分目录缓存所占用的空间。 **shrink_dcache_sb:** - **功能:** 专门针对超级块(superblock)的目录缓存进行优化。 - **应用场景:** 通常在需要快速回收特定文件系统缓存空间时使用。 **have_submounts:** - **功能:** 检查目录项是否包含子挂载点。 - **应用场景:** 对于处理复杂挂载结构的程序而言至关重要。 **shrink_dcache_parent:** - **功能:** 清理父目录下的目录缓存。 - **应用场景:** 当需要更新父目录的状态时会调用此函数。 **d_alloc:** - **功能:** 分配新的目录项结构。 - **应用场景:** 创建新目录或文件时使用。 **d_instantiate:** - **功能:** 实例化目录项,将它与inode关联起来。 - **应用场景:** 当创建新目录或文件后需要与inode绑定时调用。 **d_alloc_root:** - **功能:** 分配根目录项。 - **应用场景:** 初始化文件系统的根目录时使用。 **d_lookup:** - **功能:** 查找指定名称的目录项。 - **应用场景:** 在打开文件或执行路径解析时会调用此函数。 **d_validate:** - **功能:** 验证目录项的有效性。 - **应用场景:** 在读取或写入文件前确保目录项是可用的。 **d_delete:** - **功能:** 删除目录项。 - **应用场景:** 当删除文件或目录时使用。 **d_rehash:** - **功能:** 重新散列目录项,优化查找效率。 - **应用场景:** 在大量文件操作后为了提高性能而调用。 **d_move:** - **功能:** 移动目录项到另一个目录。 - **应用场景:** 文件移动或重命名时使用。 **__d_path:** - **功能:** 获取路径字符串。 - **应用场景:** 路径转换为字符串表示时调用。 **is_subdir:** - **功能:** 检查一个目录是否是另一个目录的子目录。 - **应用场景:** 对于文件权限检查等安全相关的场景非常有用。 **find_inode_number:** - **功能:** 查找inode编号。 - **应用场景:** 当需要根据inode获取其编号时使用。 **d_drop:** - **功能:** 丢弃目录项。 - **应用场景:** 在释放内存时使用。 **d_add:** - **功能:** 添加目录项到缓存。 - **应用场景:** 创建文件或目录后将其加入缓存。 **dget:** - **功能:** 增加目录项引用计数。 - **应用场景:** 当有多个进程引用同一个目录项时使用。 **d_unhashed:** - **功能:** 将目录项从哈希表中移除。 - **应用场景:** 当目录项不再被使用时调用。 ##### Inode处理 **__mark_inode_dirty:** - **功能:** 标记inode为脏状态。 - **应用场景:** 在修改inode内容后使用,以便后续同步到磁盘。 **write_inode_now:** - **功能:** 强制将inode内容写回磁盘。 - **应用场景:** 确保inode更改持久化的关键函数。 **clear_inode:** - **功能:** 清空inode的内容。 - **应用场景:** 删除文件前准备inode。 **invalidate_inodes:** - **功能:** 使inode无效。 - **应用场景:** 当文件系统发生变化时使用。 **get_empty_inode:** - **功能:** 获取空的inode。 - **应用场景:** 在创建新文件时使用。 **iunique:** - **功能:** 确保inode具有唯一标识符。 - **应用场景:** 在创建新inode时保证其唯一性。 **insert_inode_hash:** - **功能:** 将inode插入哈希表。 - **应用场景:** 新inode创建后将其加入inode缓存。 **remove_inode_hash:** - **功能:** 从哈希表中移除inode。 - **应用场景:** 当inode不再需要时调用。 **iput:** - **功能:** 减少inode的引用计数。 - **应用场景:** 当inode的使用减少时调用。 **bmap:** - **功能:** 映射块到文件系统中的物理地址。 - **应用场景:** 访问文件内容时使用。 **update_atime:** - **功能:** 更新inode的访问时间。 - **应用场景:** 文件被读取时更新其访问时间。 **make_bad_inode:** - **功能:** 将inode标记为损坏状态。 - **应用场景:** 当检测到inode存在问题时使用。 **is_bad_inode:** - **功能:** 检查inode是否已损坏。 - **应用场景:** 在读取inode之前确保其有效性。 ##### 注册与超级块 **register_filesystem:** - **功能:** 注册文件系统。 - **应用场景:** 加载新文件系统模块时使用。 **unregister_filesystem:** - **功能:** 反注册文件系统。 - **应用场景:** 卸载文件系统模块时调用。 **__wait_on_super:** - **功能:** 等待超级块操作完成。 - **应用场景:** 文件系统挂载或卸载过程中使用。 **get_super:** - **功能:** 获取超级块指针。 - **应用场景:** 当需要访问超级块数据时使用。 **get_empty_super:** - **功能:** 获取空的超级块结构。 - **应用场景:** 在初始化超级块时使用。 #### 二、Linux 网络编程 Linux 提供了丰富的网络编程API,支持多种协议栈,如TCP/IP等。 ##### Socket Buffer Functions **skb_queue_empty:** - **功能:** 检查socket缓冲队列是否为空。 - **应用场景:** 在发送或接收数据包前后判断队列状态。 **skb_get:** - **功能:** 获取socket缓冲区。 - **应用场景:** 接收数据包时使用。 **kfree_skb:** - **功能:** 释放socket缓冲区。 - **应用场景:** 数据包处理完毕后释放资源。 **skb_cloned:** - **功能:** 检查socket缓冲区是否被克隆。 - **应用场景:** 当数据包被复制时确认是否需要额外处理。 **skb_shared:** - **功能:** 检查socket缓冲区是否被共享。 - **应用场景:** 确保数据包不会被意外修改。 **skb_unshare:** - **功能:** 将共享的socket缓冲区分割。 - **应用场景:** 在修改共享数据包时使用。 **skb_peek:** - **功能:** 预览socket缓冲区的数据而不改变内部状态。 - **应用场景:** 数据包预处理时使用。 **skb_peek_tail:** - **功能:** 预览socket缓冲区尾部的数据。 - **应用场景:** 数据包预处理时使用。 **skb_queue_len:** - **功能:** 获取socket缓冲队列长度。 - **应用场景:** 监控队列大小时使用。 **__skb_queue_head:** - **功能:** 插入数据包到队列头部。 - **应用场景:** 发送数据包时使用。 **skb_queue_head:** - **功能:** 同上。 **__skb_queue_tail:** - **功能:** 插入数据包到队列尾部。 - **应用场景:** 发送数据包时使用。 **skb_queue_tail:** - **功能:** 同上。 **__skb_dequeue:** - **功能:** 从队列头部移除数据包。 - **应用场景:** 处理数据包时使用。 **skb_dequeue:** - **功能:** 同上。 **skb_insert:** - **功能:** 在队列中的特定位置插入数据包。 - **应用场景:** 调整数据包顺序时使用。 **skb_append:** - **功能:** 同上。 **skb_unlink:** - **功能:** 从队列中移除数据包但不销毁。 - **应用场景:** 需要保留数据包时使用。 **__skb_dequeue_tail:** - **功能:** 从队列尾部移除数据包。 - **应用场景:** 处理数据包时使用。 **skb_dequeue_tail:** - **功能:** 同上。 **skb_put:** - **功能:** 在socket缓冲区末尾添加数据。 - **应用场景:** 发送数据包时使用。 **skb_push:** - **功能:** 在socket缓冲区头部添加数据。 - **应用场景:** 发送数据包时使用。 **skb_pull:** - **功能:** 从socket缓冲区头部移除数据。 - **应用场景:** 处理数据包时使用。 **skb_headroom:** - **功能:** 获取socket缓冲区头部可用空间。 - **应用场景:** 发送数据包前确定是否有足够空间。 **skb_tailroom:** - **功能:** 获取socket缓冲区尾部可用空间。 - **应用场景:** 发送数据包前确定是否有足够空间。 **skb_reserve:** - **功能:** 预留socket缓冲区空间。 - **应用场景:** 避免频繁分配释放内存。 **skb_trim:** - **功能:** 调整socket缓冲区大小。 - **应用场景:** 优化内存使用。 **skb_orphan:** - **功能:** 断开数据包与socket的关联。 - **应用场景:** 数据包处理完毕后释放资源。 **skb_queue_purge:** - **功能:** 清空socket缓冲队列。 - **应用场景:** 关闭连接或清理资源时使用。 **__skb_queue_purge:** - **功能:** 同上。 **dev_alloc_skb:** - **功能:** 分配socket缓冲区。 - **应用场景:** 创建数据包时使用。 **skb_cow:** - **功能:** 实现copy-on-write机制。 - **应用场景:** 在修改共享数据包时避免不必要的拷贝。 **skb_over_panic:** - **功能:** 检测socket缓冲区溢出。 - **应用场景:** 防止内存溢出导致的崩溃。 **skb_under_panic:** - **功能:** 检测socket缓冲区不足。 - **应用场景:** 防止因内存不足导致的问题。 **alloc_skb:** - **功能:** 分配socket缓冲区。 - **应用场景:** 创建数据包时使用。 **__kfree_skb:** - **功能:** 释放socket缓冲区。 - **应用场景:** 数据包处理完毕后释放资源。 这些API构成了Linux操作系统中管理和操作文件系统以及网络数据包的基础,对于理解Linux内核工作原理和进行高级系统编程至关重要。