eBPF 入门开发实践指南六:捕获进程发送信号的系统调用集合,使用 hash map 保存状态

本文介绍了如何使用eBPF在Linux内核中动态加载和运行用户代码,监控kill、tkill和tgkill系统调用,捕获进程发送信号的信息。通过hashmap保存状态,并在系统调用退出时打印相关信息。文章提供了一个示例代码,展示了如何定义探针函数、使用bpf_mapAPI以及编译和运行eBPF程序的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。

本文是 eBPF 入门开发实践指南的第六篇,主要介绍如何实现一个 eBPF 工具,捕获进程发送信号的系统调用集合,使用 hash map 保存状态。

sigsnoop

示例代码如下:

#include <vmlinux.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>

#define MAX_ENTRIES 10240
#define TASK_COMM_LEN 16

struct event {
   
   
 unsigned int pid;
 unsigned int tpid;
 int sig;
 int ret;
 char comm[TASK_COMM_LEN];
};

struct {
   
   
 __uint(type, BPF_MAP_TYPE_HASH);
 __uint(max_entries, MAX_ENTRIES);
 __type(key, __u32);
 __type(value, struct event
### BPF Map使用方法及示例 #### 什么是BPF Map? BPF Maps 是一种用于存储数据结构的数据容器,允许内核空间和用户空间之间共享数据。Maps 支持多种类型的操作,如创建、查找、更新和删除键值对[^1]。 #### 创建 BPF Map 为了在程序中使用 BPF Map,首先需要定义并初始化该映射。下面是一个简单的例子来展示如何创建一个哈希类型的 BPF Map: ```c #include <linux/bpf.h> #include <bpf/bpf.h> struct bpf_map_def SEC("maps") example_hash_map = { .type = BPF_MAP_TYPE_HASH, .key_size = sizeof(int), .value_size = sizeof(long), .max_entries = 1024, }; ``` 这段代码片段展示了如何声明一个名为 `example_hash_map` 的哈希表型 BPF Map,在这里指定了键大小为整数长度 (`sizeof(int)`), 值大小为长整形(`sizeof(long)`) 并设定了最大条目数量为 1024 条记录。 #### 向 BPF Map 中写入数据 一旦成功创建了一个 BPF Map,则可以通过调用特定函数向其中插入新的键值对。以下是 Python 绑定 libbpf 库的一个简单实例: ```python import ctypes as ct from bcc import BPF # 加载 eBPF 程序源码... with open('program.c', 'r') as f: program_source = f.read() b = BPF(text=program_source) # 获取到我们之前定义好的 hash 表对象 hash_table = b.get_table("example_hash_map") # 插入一条新纪录 (假设 key 和 value 都是 int 类型) key = ct.c_int(1) value = ct.c_long(42) hash_table[key] = value ``` 此段脚本说明了怎样利用 Python 结合 BCC 工具链操作已存在的 BPF Hash Table 进行元素的增删改查等基本功能。 #### 查询 BPF Map 数据 查询已经存放在 BPF Map 内的信息同样重要。可以采用如下方式读取指定 Key 对应 Value : ```python try: fetched_value = hash_table[ct.c_int(1)] print(f"Fetched value is {fetched_value.value}") except KeyError: print("Key not found.") ``` 上述代码尝试获取键为 1 所对应的值,并打印出来;如果找不到对应项则捕获异常并给出提示信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值