【发布时间】:2021-08-10 18:54:50
【问题描述】:
我对 c++ 还是有点陌生,我无法理解这段代码在做什么:
#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);
}
}
}
我认为这里的“BEGIN”部分是定义一个宏,但我不完全确定。我真正感到困惑的是
kprobe:ip4_datagram_connect,
kprobe:ip6_datagram_connect
{
这是在做什么?这似乎是一个函数声明,但在这种情况下,单冒号是什么意思?这是某种初始化列表,但对于函数?是否将 ip4 和 ip6 都设置为该功能?
另外,美元符号变量名有什么意义吗?还是它们只是声明变量的一种有效方式?
这是来自密件抄送工具的 udpconnect.bt 代码。我正在尝试将其转换为 python。
【问题讨论】:
-
这不是 C++,至少不是我以前见过的任何 C++。
-
真的吗? bcc python 开发的文档只显示了 c 和 c++。所以我从语法上认为它是 c++。
-
这看起来更像 Perl 而不是 C++,但两者都不是,它是 bfptrace github.com/iovisor/bpftrace/blob/master/README.md
-
看起来有点像
awk。可能是预处理过的C++? -
“bpftrace 语言的灵感来自 awk 和 C,以及 DTrace 和 SystemTap 等前身跟踪器。”
标签: bcc-bpf