首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++中的冒号函数和$ variables?

c++中的冒号函数和$ variables?
EN

Stack Overflow用户
提问于 2021-08-10 18:54:51
回答 1查看 61关注 0票数 0

对于c++,我还是个新手,我很难理解这段代码在做什么:

代码语言:javascript
复制
    #include <net/sock.h>

BEGIN
{
    printf("%-8s %-6s %-16s %-2s %-16s %-5s\n", "TIME", "PID", "COMM",
        "IP", "RADDR", "RPORT");
}

kprobe:ip4_datagram_connect,
kprobe:ip6_datagram_connect
{
    $sk = (struct sock *)arg0;
    $sa = (struct sockaddr *)arg1;
    if (($sa->sa_family == AF_INET || $sa->sa_family == AF_INET6) &&
        $sk->sk_protocol == IPPROTO_UDP) {
        time("%H:%M:%S ");
        if ($sa->sa_family == AF_INET) {
            $s = (struct sockaddr_in *)arg1;
            $port = ($s->sin_port >> 8) |
                (($s->sin_port << 8) & 0xff00);
            printf("%-6d %-16s 4  %-16s %-5d\n", pid, comm,
                ntop(AF_INET, $s->sin_addr.s_addr), $port);
        } else {
            $s6 = (struct sockaddr_in6 *)arg1;
            $port = ($s6->sin6_port >> 8) |
                (($s6->sin6_port << 8) & 0xff00);
            printf("%-6d %-16s 6  %-16s %-5d\n", pid, comm,
                ntop(AF_INET6, $s6->sin6_addr.in6_u.u6_addr8),
                $port);
        }
    }
}

我认为“开始”部分是定义宏,但我不能完全确定。我真正困惑的是

代码语言:javascript
复制
kprobe:ip4_datagram_connect,
kprobe:ip6_datagram_connect
{

这是在做什么?它看起来像一个函数声明,但在这个上下文中,单个冒号是什么意思呢?除了函数之外,这是某种排序的初始化列表吗?是否将ip4和ip6都设置为该函数?

另外,美元符号变量名是否有任何意义?或者它们只是一种声明变量的有效方式?

这是密件抄送工具中的udpconnect.bt代码。我正试着把它转换成python。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-10 19:35:20

正如注释中所提到的,这是一个用于bpftrace的脚本。您可能需要查看此工具的the reference guide

BEGIN块在程序开始时运行(就像awk脚本一样,如果您熟悉它的话)。在本例中,它用于将数组的标题行打印到控制台输出。

然后是代码块:

代码语言:javascript
复制
kprobe:ip4_datagram_connect,
kprobe:ip6_datagram_connect
{

..。定义将被翻译成eBPF program的指令(中间步骤作为LLVM中间表示),并附加到Linux内核中的一个或多个钩子上。在本例中,钩子由kprobe:...定义:对于内核中的函数ip4_datagram_connect及其对应的IPv6,程序将作为kprobe函数运行。换句话说,每次内核进入这些函数时,它都会运行。

快速查看一下,我认为程序应该打印每次UDP流启动时,打开套接字的进程的时间、PID和名称、IP地址、远程地址和远程端口。第一个if检查数据包是否为(IPv4 or IPv6) and UDP,下面的if/else将两种情况分为IPv4/IPv6。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68732195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档