libbpf 开发指南:设置libbpf的函数回调打印

文章展示了如何使用libbpf_set_print函数设置自定义的日志回调函数,用于处理libbpf库的警告和信息消息。提供的代码示例包括一个简单的自定义打印函数custom_print_fn,以及一个加载BPF程序的示例。Makefile和CMakeLists.txt文件分别展示了两种构建系统的配置方法。

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

目录

函数原型

代码demo

makefile

cmake


函数原型

/*    libbpf_set_print() sets user-provided log callback function to be used for libbpf warnings and informational messages.

    This function is thread-safe.

    Parameters:

        fn – The log print function. If NULL, libbpf won’t print anything.
    Returns:

        Pointer to old print function.


*/
LIBBPF_API libbpf_print_fn_t libbpf_set_print (libbpf_print_fn_t fn)

代码demo

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <bpf/libbpf.h>
#include <linux/bpf.h>
#include "bpf_helpers.h"
static int custom_print_fn(enum libbpf_print_level level, const char *format, va_list args) {
    const char *level_prefix;

    switch (level) {
        case LIBBPF_DEBUG:
            level_prefix = "DEBUG";
            break;
        case LIBBPF_INFO:
            level_prefix = "INFO";
            break;
        case LIBBPF_WARN:
            level_prefix = "WARN";
            break;
        case LIBBPF_ERROR:
            level_prefix = "ERROR";
            break;
        default:
            level_prefix = "UNKNOWN";
            break;
    }

    printf("[%s] ", level_prefix);
    return vprintf(format, args);
}

int main() {
    libbpf_set_print(custom_print_fn);

    struct bpf_insn prog[] = {
        BPF_MOV64_IMM(BPF_REG_0, 0),
        BPF_EXIT_INSN(),
    };

    struct bpf_load_program_attr attr = {
        .prog_type = BPF_PROG_TYPE_XDP,
        .insns = prog,
        .insn_cnt = sizeof(prog) / sizeof(struct bpf_insn),
        .license = "GPL",
    };

    int prog_fd = bpf_load_program_xattr(&attr, NULL, 0);
    if (prog_fd < 0) {
        perror("Failed to load BPF program");
        return 1;
    }

    printf("BPF program loaded successfully\n");

    close(prog_fd);
    return 0;
}

makefile

CC = gcc
CFLAGS = -Wall -Wextra -Werror
LDFLAGS = $(shell pkg-config --libs libbpf)

all: libbpf_print_callback_demo

libbpf_print_callback_demo: libbpf_print_callback_demo.o
	$(CC) -o $@ $^ $(LDFLAGS)

libbpf_print_callback_demo.o: libbpf_print_callback_demo.c
	$(CC) $(CFLAGS) -c $<

clean:
	rm -f *.o libbpf_print_callback_demo

.PHONY: all clean

cmake

cmake_minimum_required(VERSION 3.10)
project(libbpf_print_callback_demo LANGUAGES C)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)

find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBBPF REQUIRED IMPORTED_TARGET libbpf)

add_executable(libbpf_print_callback_demo libbpf_print_callback_demo.c)
target_link_libraries(libbpf_print_callback_demo PRIVATE PkgConfig::LIBBPF)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ym影子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值