Ошибка в исходном коде не имеет ничего общего с B CC & BPF и лежит в моей реализации ctypes. Для начала -
class procName(Structure):
_fields_ = [("name", (c_char_p*16))]
создает структуру с полем «имя». В приведенном выше определении name будет иметь тип * char [16], когда я хочу char [16]. Во-вторых, хотя это
myFirst = procName(('p','y','t','h','o','n','\0'))
может сработать, это не лучший способ инициализации. Это правильный подход -
class procName(Structure):
_fields_ = [("name", (c_char*16))]
s = "python"
mySecond = procName()
mySecond.name = s
Таким образом, полная программа, включающая ключ на основе имя_процесса и его реализация для передачи данных из python, будет ..
from bcc import BPF
from bcc.utils import printb
from bcc.syscall import syscall_name, syscalls
import ctypes
from ctypes import *
b = BPF(text = """
#include <linux/string.h>
struct procName {
char name[16];
};
BPF_HASH(attempt, struct procName, u32);
TRACEPOINT_PROBE(raw_syscalls, sys_exit)
{
u32 *myVal;
struct procName key;
bpf_get_current_comm(&(key.name),16);
myVal = attempt.lookup(&key);
if (myVal)
{
bpf_trace_printk("values: %d\\n", *myVal);
}
return 0;
}
""")
class procName(Structure):
_fields_ = [("name", (c_char*16))]
trialUpload = b["attempt"]
s = "python"
mySecond = procName()
mySecond.name = s
trialUpload[mySecond] = c_int(5)
while 1:
try:
(task, pid, cpu, flags, ts, msg) = b.trace_fields()
except KeyboardInterrupt:
print("Detaching")
exit()
print("%-18.9f %-16s %-6d %s" % (ts, task, pid, msg))