O_CLOEXEC模式和FD_CLOEXEC选项

本文深入探讨了O_CLOEXEC模式和FD_CLOEXEC选项在文件描述符管理中的作用,特别是在exec调用和多线程环境中的表现。通过示例代码展示了这两种方法如何影响文件描述符的行为,并提供了具体的测试步骤来验证它们的效果。

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

O_CLOEXEC模式和FD_CLOEXEC选项

  • 调用open函数O_CLOEXEC模式打开的文件描述符在执行exec调用新程序中关闭,且为原子操作。
  • 调用open函数不使用O_CLOEXEC模式打开的文件描述符,然后调用fcntl 函数设置FD_CLOEXEC选项,效果和使用O_CLOEXEC选项open函数相同,但分别调用openfcnt两个函数,不是原子操作,多线程环境中存在竞态条件,故用open函数O_CLOEXEC选项代替之。
  • 调用open函数O_CLOEXEC模式打开的文件描述符,或是使用fcntl设置FD_CLOEXEC选项,这二者得到(处理)的描述符在通过fork调用产生的子进程中均不被关闭。
  • 调用dup族类函数得到的新文件描述符将清除O_CLOEXEC模式。

code:

#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#define err_sys(fmt, arg...) \
do { \
    printf(fmt, ##arg);\
    printf("\nerrno:%d %s\n", errno, strerror(errno));\
    exit(EXIT_FAILURE);\
} while (0)


int main()
{
    int fd, fd2, val;
    pid_t pid;
#ifdef _O_CLOEXEC
    if ((fd = open("my.txt", O_RDWR | O_CREAT | O_CLOEXEC, 0600)) < 0) 
#else
    if ((fd = open("my.txt", O_RDWR | O_CREAT, 0600)) < 0) 
#endif
        err_sys("open error");

#ifdef _DUP
    if ((fd2 = dup(fd)) < 0)
        err_sys("dup error");
    if (write(fd2, "123", 3) < 0)
        err_sys("write error");
#endif

#ifdef _FCNTL_CLOEXEC
    if ((val = fcntl(fd, F_GETFD)) < 0)
        err_sys("fcntl(F_GETFD) error");

    val |= FD_CLOEXEC;
    if (fcntl(fd, F_SETFD, val) < 0)
        err_sys("fcntl( F_SETFD) error");
#endif

#ifndef _FORK 
    if (execl("/bin/sleep", "sleep", "10000", (void*)0) < 0)
        err_sys("execl error");
#else
 switch ((pid = fork())) {
        case -1:
            err_sys("fork error");
        case 0:
            sleep(10000);
            break;
        default:
            sleep(10000);
            break;
    }
#endif

    return 0;
}

通过宏_O_CLOEXEC编译进O_CLOEXEC选项
gcc -D_O_CLOEXEC -o cloexec cloexec.c
执行程序
./cloexec
查看进程和进程资源,注意执行execl后进程名字变为sleep
ps aux|grep sleep
1463068253963
lsof -p 6479
Alt text
可以看出进程资源中没有文件my.txt
不带宏_O_CLOEXEC编译
gcc -o nocloexec cloexec.c
执行程序
./nocloexec
查看进程和进程资源
ps aux|grep sleep
Alt text
lsof -p 6497
Alt text
可以看出进程资源中有文件my.txt
测试fcntl函数可以通过设置编译宏-D_FCNTL_CLOEXEC测试,编译测试过程同上,同理通过开启-D_O_CLOEXEC -D_FORK编译>选项测试使用O_CLOEXEC模式的描述符在子进程中的状态,通过宏-D_DUP编译选项测试dup函数对O_CLOEXEC的影响,编译测试过程略。

execve("./whitelist_kern", ["./whitelist_kern", "lo"], 0x7ffe9bf66ae8 /* 42 vars */) = 0 brk(NULL) = 0xb3f000 arch_prctl(0x3001 /* ARCH_??? */, 0x7fff50800dc0) = -1 EINVAL (无效的参数) access("/etc/ld.so.preload", R_OK) = -1 ENOENT (没有那个文件或目录) openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=38163, ...}) = 0 mmap(NULL, 38163, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f53ee026000 close(3) = 0 openat(AT_FDCWD, "/lib64/librt.so.1", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000$\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=42744, ...}) = 0 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f53ee024000 mmap(NULL, 4225984, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f53ed9fa000 mmap(0x7f53eda00000, 2128832, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x7f53eda00000 munmap(0x7f53ed9fa000, 24576) = 0 munmap(0x7f53edc08000, 2071488) = 0 mprotect(0x7f53eda07000, 2093056, PROT_NONE) = 0 mmap(0x7f53edc06000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7f53edc06000 close(3) = 0 openat(AT_FDCWD, "/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\16\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=19128, ...}) = 0 mmap(NULL, 4206752, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f53ed5fc000 mmap(0x7f53ed600000, 2109600, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x7f53ed600000 munmap(0x7f53ed5fc000, 16384) = 0 munmap(0x7f53ed804000, 2076832) = 0 mprotect(0x7f53ed603000, 2093056, PROT_NONE) = 0 mmap(0x7f53ed802000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f53ed802000 close(3) = 0 openat(AT_FDCWD, "/lib64/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 p\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=150472, ...}) = 0 mmap(NULL, 4322528, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f53ed1e0000 mmap(0x7f53ed200000, 2225376, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x7f53ed200000 munmap(0x7f53ed1e0000, 131072) = 0 munmap(0x7f53ed420000, 1963232) = 0 mprotect(0x7f53ed21b000, 2093056, PROT_NONE) = 0 mmap(0x7f53ed41a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a000) = 0x7f53ed41a000 mmap(0x7f53ed41c000, 13536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f53ed41c000 close(3) = 0 openat(AT_FDCWD, "/lib64/libm.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \305\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=1598816, ...}) = 0 mmap(NULL, 5771584, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f53ecc7e000 mmap(0x7f53ece00000, 3674432, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x7f53ece00000 munmap(0x7f53ecc7e000, 1581056) = 0 munmap(0x7f53ed182000, 512320) = 0 mprotect(0x7f53ecf81000, 2093056, PROT_NONE) = 0 mmap(0x7f53ed180000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x180000) = 0x7f53ed180000 close(3) = 0 openat(AT_FDCWD, "/lib64/libelf.so.1", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0203\0\0\0\0\0\0"..., 832) = 832 lseek(3, 94200, SEEK_SET) = 94200 read(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32) = 32 fstat(3, {st_mode=S_IFREG|0755, st_size=104792, ...}) = 0 lseek(3, 94200, SEEK_SET) = 94200 read(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32) = 32 mmap(NULL, 4292624, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f53ec9e7000 mmap(0x7f53eca00000, 2195472, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x7f53eca00000 munmap(0x7f53ec9e7000, 102400) = 0 munmap(0x7f53ecc19000, 1990672) = 0 mprotect(0x7f53eca18000, 2093056, PROT_NONE) = 0 mmap(0x7f53ecc17000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17000) = 0x7f53ecc17000 mmap(0x7f53ecc18000, 16, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f53ecc18000 close(3) = 0 openat(AT_FDCWD, "/lib64/libz.so.1", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240'\0\0\0\0\0\0"..., 832) = 832 lseek(3, 88768, SEEK_SET) = 88768 read(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32) = 32 fstat(3, {st_mode=S_IFREG|0755, st_size=99592, ...}) = 0 lseek(3, 88768, SEEK_SET) = 88768 read(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32) = 32 mmap(NULL, 4288520, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f53ec5e8000 mmap(0x7f53ec600000, 2191368, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x7f53ec600000 munmap(0x7f53ec5e8000, 98304) = 0 munmap(0x7f53ec818000, 1994760) = 0 mprotect(0x7f53ec616000, 2097152, PROT_NONE) = 0 mmap(0x7f53ec816000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16000) = 0x7f53ec816000 mmap(0x7f53ec817000, 8, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f53ec817000 close(3) = 0 openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\256\3\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=2090288, ...}) = 0 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f53ee022000 lseek(3, 808, SEEK_SET) = 808 read(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32) = 32 mmap(NULL, 6047968, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f53ec03b000 mmap(0x7f53ec200000, 3950816, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x7f53ec200000 munmap(0x7f53ec03b000, 1855488) = 0 munmap(0x7f53ec5c5000, 239840) = 0 mprotect(0x7f53ec3bc000, 2093056, PROT_NONE) = 0 mmap(0x7f53ec5bb000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1bb000) = 0x7f53ec5bb000 mmap(0x7f53ec5c1000, 14560, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f53ec5c1000 close(3) = 0 mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f53ee01f000 arch_prctl(ARCH_SET_FS, 0x7f53ee01f740) = 0 mprotect(0x7f53ec5bb000, 16384, PROT_READ) = 0 mprotect(0x7f53ec816000, 4096, PROT_READ) = 0 mprotect(0x7f53ecc17000, 4096, PROT_READ) = 0 mprotect(0x7f53ed180000, 4096, PROT_READ) = 0 mprotect(0x7f53ed41a000, 4096, PROT_READ) = 0 mprotect(0x7f53ed802000, 4096, PROT_READ) = 0 mprotect(0x7f53edc06000, 4096, PROT_READ) = 0 mprotect(0x652000, 4096, PROT_READ) = 0 mprotect(0x7f53ee030000, 4096, PROT_READ) = 0 munmap(0x7f53ee026000, 38163) = 0 set_tid_address(0x7f53ee01fa10) = 12810 set_robust_list(0x7f53ee01fa20, 24) = 0 rt_sigaction(SIGRTMIN, {sa_handler=0x7f53ed206aa0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f53ed212ec0}, NULL, 8) = 0 rt_sigaction(SIGRT_1, {sa_handler=0x7f53ed206b30, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7f53ed212ec0}, NULL, 8) = 0 rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0 prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0 access("/proc/net", R_OK) = 0 access("/proc/net/unix", R_OK) = 0 socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 3 ioctl(3, SIOCGIFINDEX, {ifr_name="lo", ifr_ifindex=1}) = 0 close(3) = 0 getrandom("\x1a\xd9\x43\xcd\x6d\xa8\xd8\xb9", 8, GRND_NONBLOCK) = 8 brk(NULL) = 0xb3f000 brk(0xb60000) = 0xb60000 brk(NULL) = 0xb60000 faccessat(AT_FDCWD, "/proc/version_signature", R_OK) = -1 ENOENT (没有那个文件或目录) uname({sysname="Linux", nodename="localhost.localdomain", ...}) = 0 memfd_create("libbpf-placeholder-fd", MFD_CLOEXEC|0x8) = -1 EINVAL (无效的参数) memfd_create("libbpf-placeholder-fd", MFD_CLOEXEC) = 3 memfd_create("libbpf-placeholder-fd", MFD_CLOEXEC|0x8) = -1 EINVAL (无效的参数) memfd_create("libbpf-placeholder-fd", MFD_CLOEXEC) = 4 memfd_create("libbpf-placeholder-fd", MFD_CLOEXEC|0x8) = -1 EINVAL (无效的参数) memfd_create("libbpf-placeholder-fd", MFD_CLOEXEC) = 5 memfd_create("libbpf-placeholder-fd", MFD_CLOEXEC|0x8) = -1 EINVAL (无效的参数) memfd_create("libbpf-placeholder-fd", MFD_CLOEXEC) = 6 openat(AT_FDCWD, "/sys/fs/bpf", O_RDONLY|O_DIRECTORY) = 7 bpf(0x24 /* BPF_??? */, 0x7fff508007f0, 8) = -1 EINVAL (无效的参数) close(7) = 0 bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_SOCKET_FILTER, insn_cnt=2, insns=0x7fff508007a0, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(0, 0, 0), prog_flags=0, prog_name="", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=0, func_info_rec_size=0, func_info=NULL, func_info_cnt=0, line_info_rec_size=0, line_info=NULL, line_info_cnt=0, attach_btf_id=0, attach_prog_fd=0}, 148) = -1 EPERM (不允许的操作) prlimit64(0, RLIMIT_MEMLOCK, {rlim_cur=RLIM64_INFINITY, rlim_max=RLIM64_INFINITY}, NULL) = 0 bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_SOCKET_FILTER, insn_cnt=2, insns=0x7fff50800940, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(0, 0, 0), prog_flags=0, prog_name="", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=0, func_info_rec_size=0, func_info=NULL, func_info_cnt=0, line_info_rec_size=0, line_info=NULL, line_info_cnt=0, attach_btf_id=0, attach_prog_fd=0}, 152) = 7 close(7) = 0 bpf(BPF_BTF_LOAD, {btf="\237\353\1\0\30\0\0\0\0\0\0\0000\0\0\0000\0\0\0\t\0\0\0\1\0\0\0\0\0\0\1"..., btf_log_buf=NULL, btf_size=81, btf_log_size=0, btf_log_level=0}, 40) = 7 close(7) = 0 bpf(BPF_BTF_LOAD, {btf="\237\353\1\0\30\0\0\0\0\0\0\0000\0\0\0000\0\0\0\5\0\0\0\0\0\0\0\0\0\0\1"..., btf_log_buf=NULL, btf_size=77, btf_log_size=0, btf_log_level=0}, 40) = -1 EINVAL (无效的参数) bpf(BPF_BTF_LOAD, {btf="\237\353\1\0\30\0\0\0\0\0\0\0l\0\0\0l\0\0\0\16\0\0\0\1\0\0\0\0\0\0\1"..., btf_log_buf=NULL, btf_size=146, btf_log_size=0, btf_log_level=0}, 40) = -1 EINVAL (无效的参数) bpf(BPF_BTF_LOAD, {btf="\237\353\1\0\30\0\0\0\0\0\0\0\20\0\0\0\20\0\0\0\5\0\0\0\1\0\0\0\0\0\0\1"..., btf_log_buf=NULL, btf_size=45, btf_log_size=0, btf_log_level=0}, 40) = 7 close(7) = 0 bpf(BPF_BTF_LOAD, {btf="\237\353\1\0\30\0\0\0\0\0\0\0000\0\0\0000\0\0\0\t\0\0\0\1\0\0\0\0\0\0\1"..., btf_log_buf=NULL, btf_size=81, btf_log_size=0, btf_log_level=0}, 40) = 7 close(7) = 0 bpf(BPF_BTF_LOAD, {btf="\237\353\1\0\30\0\0\0\0\0\0\08\0\0\08\0\0\0\t\0\0\0\0\0\0\0\0\0\0\1"..., btf_log_buf=NULL, btf_size=89, btf_log_size=0, btf_log_level=0}, 40) = 7 close(7) = 0 bpf(BPF_BTF_LOAD, {btf="\237\353\1\0\30\0\0\0\0\0\0\0\f\0\0\0\f\0\0\0\7\0\0\0\1\0\0\0\0\0\0\20"..., btf_log_buf=NULL, btf_size=43, btf_log_size=0, btf_log_level=0}, 40) = -1 EINVAL (无效的参数) bpf(BPF_BTF_LOAD, {btf="\237\353\1\0\30\0\0\0\0\0\0\0(\0\0\0(\0\0\0\5\0\0\0\0\0\0\0\0\0\0\1"..., btf_log_buf=NULL, btf_size=69, btf_log_size=0, btf_log_level=0}, 40) = -1 EINVAL (无效的参数) bpf(BPF_BTF_LOAD, {btf="\237\353\1\0\30\0\0\0\0\0\0\0\f\0\0\0\f\0\0\0\10\0\0\0\1\0\0\0\0\0\0\23"..., btf_log_buf=NULL, btf_size=44, btf_log_size=0, btf_log_level=0}, 40) = -1 EINVAL (无效的参数) bpf(BPF_BTF_LOAD, {btf="\237\353\1\0\30\0\0\0\0\0\0\08\0\0\08\0\0\0\n\0\0\0\0\0\0\0\0\0\0\1"..., btf_log_buf=NULL, btf_size=90, btf_log_size=0, btf_log_level=0}, 40) = -1 EINVAL (无效的参数) bpf(BPF_BTF_LOAD, {btf="\237\353\1\0\30\0\0\0\0\0\0\0l\5\0\0l\5\0\0e\v\0\0\0\0\0\0\0\0\0\2"..., btf_log_buf=NULL, btf_size=4329, btf_log_size=0, btf_log_level=0}, 40) = 7 bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_SOCKET_FILTER, insn_cnt=2, insns=0x7fff50800730, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(0, 0, 0), prog_flags=0, prog_name="libbpf_nametest", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=0, func_info_rec_size=0, func_info=NULL, func_info_cnt=0, line_info_rec_size=0, line_info=NULL, line_info_cnt=0, attach_btf_id=0, attach_prog_fd=0}, 148) = 8 close(8) = 0 bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_ARRAY, key_size=4, value_size=4, max_entries=4, map_flags=0, inner_map_fd=0, map_name="config_map", map_ifindex=0, btf_fd=7, btf_key_type_id=8, btf_value_type_id=8, btf_vmlinux_value_type_id=0}, 80) = 8 dup3(8, 3, O_CLOEXEC) = 3 close(8) = 0 bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_PERCPU_ARRAY, key_size=4, value_size=16, max_entries=1, map_flags=0, inner_map_fd=0, map_name="state_map", map_ifindex=0, btf_fd=7, btf_key_type_id=8, btf_value_type_id=17, btf_vmlinux_value_type_id=0}, 80) = 8 dup3(8, 4, O_CLOEXEC) = 4 close(8) = 0 bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_RINGBUF, key_size=0, value_size=0, max_entries=262144, map_flags=0, inner_map_fd=0, map_name="alerts_map", map_ifindex=0, btf_fd=7, btf_key_type_id=0, btf_value_type_id=0, btf_vmlinux_value_type_id=0}, 80) = 8 dup3(8, 5, O_CLOEXEC) = 5 close(8) = 0 bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_HASH, key_size=40, value_size=1, max_entries=2048, map_flags=0, inner_map_fd=0, map_name="whitelist_map", map_ifindex=0, btf_fd=7, btf_key_type_id=31, btf_value_type_id=36, btf_vmlinux_value_type_id=0}, 80) = 8 dup3(8, 6, O_CLOEXEC) = 6 close(8) = 0 bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_CGROUP_SOCK, insn_cnt=2, insns=0x7fff507fff50, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(0, 0, 0), prog_flags=0, prog_name="", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_SOCK_CREATE, prog_btf_fd=0, func_info_rec_size=0, func_info=NULL, func_info_cnt=0, line_info_rec_size=0, line_info=NULL, line_info_cnt=0, attach_btf_id=0, attach_prog_fd=0}, 152) = 8 close(8) = 0 bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=262, insns=0xb40030, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(5, 10, 134), prog_flags=0x40 /* BPF_F_??? */, prog_name="xdp_whitelist", prog_ifindex=0, expected_attach_type=BPF_XDP, prog_btf_fd=7, func_info_rec_size=8, func_info=0xb3f640, func_info_cnt=1, line_info_rec_size=16, line_info=0xb3f660, line_info_cnt=91, attach_btf_id=0, attach_prog_fd=0}, 152) = -1 EINVAL (无效的参数) mmap(NULL, 16781312, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f53eb1ff000 bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=262, insns=0xb40030, license="GPL", log_level=1, log_size=16777215, log_buf="", kern_version=KERNEL_VERSION(5, 10, 134), prog_flags=0x40 /* BPF_F_??? */, prog_name="xdp_whitelist", prog_ifindex=0, expected_attach_type=BPF_XDP, prog_btf_fd=7, func_info_rec_size=8, func_info=0xb3f640, func_info_cnt=1, line_info_rec_size=16, line_info=0xb3f660, line_info_cnt=91, attach_btf_id=0, attach_prog_fd=0}, 152) = -1 EINVAL (无效的参数) write(2, "libbpf: prog 'xdp_whitelist': BP"..., 63) = 63 munmap(0x7f53eb1ff000, 16781312) = 0 write(2, "libbpf: prog 'xdp_whitelist': fa"..., 54) = 54 close(3) = 0 close(4) = 0 close(5) = 0 close(6) = 0 write(2, "libbpf: failed to load object 'w"..., 51) = 51 write(2, "libbpf: failed to load BPF skele"..., 66) = 66 write(2, "Failed to load BPF skeleton: -22"..., 33) = 33 write(2, "libbpf: bpf_xdp_attach_opts has "..., 53) = 53 close(7) = 0 exit_group(-22) = ? +++ exited with 234 +++
最新发布
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值