Re: madvise(MADV_FREE) doesn't work in some cases?
Date: Sat, 03 Jul 2021 08:34:50 UTC
> On 3 Jul 2021, at 09:54, Gary Jennejohn <gljennjohn@gmail.com> wrote: > > The FreeBSD mail server apparently removed the attachment. > > So either provide it in-line or put it on some pubic file server and > add a link to it. > > -- > Gary Jennejohn #include <sys/mman.h> #include <err.h> #include <stdint.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> int main(int argc, char *argv[]) { size_t len = (size_t)(argc > 1 ? atoi(argv[1]) : 1024) * 1024 * 1024; uint8_t *ptr, *end, *p; unsigned pagesz = 1<<12; int pid; ptr = mmap(NULL, len, PROT_WRITE | PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (ptr == MAP_FAILED) err(1, "cannot mmap"); end = ptr + len; printf("mmap %p pid %d\n", ptr, getpid()); printf("end %p len %#lx\n", end, len); fflush(stdout); pid = fork(); if (pid < 0) err(1, "cannot fork"); printf("pid %d\n", getpid()); sleep(pid == 0 ? 1 : 14); printf("%d: touch\n", getpid()); p = ptr; while (p < end) { *p = 1; p += pagesz; } printf("%d: sleep before madvise\n", getpid()); sleep(pid == 0 ? 1 : 4); printf("%d, madvise\n", getpid()); p = ptr; while (p < end) { int error; error = madvise(p, pagesz, MADV_FREE); if (error) { err(1, "cannot madvise"); } p += pagesz; } printf("%d: Press enter to exit\n", getpid()); getchar(); } —— Vitaliy Gusev