epoll 指向的d对象导致的gc释放问题,使用手动释放gc引用的对象

1.dlang在转换成void*指针的时候,gc会认为不引用此对象,造成提前对象释放,导致epoll变成野指针。

2.使用gc手动控制对象的生命周期,手动释放。 设置对象gc属性为NO_MOVE, GC就不会引用对象了
锁定对象: GC.addRoot(cast(void*)this);
GC.setAttr(cast(void*)this, GC.BlkAttr.NO_MOVE);
释放对象:
GC.removeRoot(cast(void*)this);
GC.clrAttr(cast(void*)this, GC.BlkAttr.NO_MOVE);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Linux C 中使用 epoll 监听内存对象需要先将内存对象映射到文件系统中,然后使用 epoll 监听文件描述符即可。 具体步骤如下: 1. 创建匿名内存映射区,使用 mmap 函数将其映射到文件系统中。 2. 将内存映射区的文件描述符添加到 epoll 实例中,使用 epoll_ctl 函数实现。 3. 在 epoll_wait 函数中等待事件发生,并进行处理。 示例代码如下: ``` #include <sys/epoll.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/mman.h> #define MEM_SIZE (1024 * 1024) int main() { void *mem; int fd; int epfd; struct epoll_event event; struct epoll_event events[10]; int n; // 创建匿名内存映射区 mem = mmap(NULL, MEM_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (mem == MAP_FAILED) { perror("mmap"); exit(EXIT_FAILURE); } // 将内存映射区写入数据 memset(mem, 0, MEM_SIZE); strcpy(mem, "Hello World!"); // 将内存映射区映射到文件系统中 fd = memfd_create("memfile", MFD_CLOEXEC); if (fd == -1) { perror("memfd_create"); exit(EXIT_FAILURE); } if (write(fd, mem, MEM_SIZE) != MEM_SIZE) { perror("write"); exit(EXIT_FAILURE); } // 创建 epoll 实例 epfd = epoll_create1(0); if (epfd == -1) { perror("epoll_create1"); exit(EXIT_FAILURE); } // 将文件描述符添加到 epoll 实例中 event.data.fd = fd; event.events = EPOLLIN | EPOLLET; if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event) == -1) { perror("epoll_ctl"); exit(EXIT_FAILURE); } // 等待事件发生 while (1) { n = epoll_wait(epfd, events, 10, -1); if (n == -1) { perror("epoll_wait"); exit(EXIT_FAILURE); } for (int i = 0; i < n; i++) { if (events[i].events & EPOLLIN) { // 读取数据 char buf[1024]; int len = read(fd, buf, sizeof(buf)); if (len == -1) { perror("read"); exit(EXIT_FAILURE); } else if (len == 0) { // 文件已经被关闭 exit(EXIT_SUCCESS); } printf("Received data: %s\n", buf); } } } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值