История изменений
Исправление
cumvillain,
(текущая версия)
:
В сценарии общения один-один всё и правда норм (кроме всратого файлоцентричного API). Нюансы возникают, когда ты хочешь сделать рассылку один-много. В текущем варианте это просто не будет работать без копирования для каждого получателя.
huh?
#define _GNU_SOURCE
#include <err.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>
int
main(void)
{
int fd, dfd1, dfd2;
const char *data = "test";
const size_t data_len = strlen(data) + 1;
size_t written;
const char *copy1, *copy2;
fd = memfd_create("data", 0);
if (fd == -1)
err(1, "cannot create memfd");
written = write(fd, data, data_len);
if (written == -1)
err(1, "cannot write data to memory area");
dfd1 = dup(fd);
dfd2 = dup(fd);
copy1 = mmap(NULL, data_len, PROT_READ | PROT_WRITE, MAP_SHARED, dfd1, 0);
copy2 = mmap(NULL, data_len, PROT_READ | PROT_WRITE, MAP_SHARED, dfd2, 0);
printf("%s\n", copy1);
printf("%s\n", copy2);
return 0;
}
$ ./test
test
test
Исправление
cumvillain,
:
В сценарии общения один-один всё и правда норм (кроме всратого файлоцентричного API). Нюансы возникают, когда ты хочешь сделать рассылку один-много. В текущем варианте это просто не будет работать без копирования для каждого получателя.
huh?
$ cat test.c
#define _GNU_SOURCE
#include <err.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>
int
main(void)
{
int fd;
const char *data = "test";
const size_t data_len = strlen(data) + 1;
size_t written;
const char *copy1, *copy2;
fd = memfd_create("data", 0);
if (fd == -1)
err(1, "cannot create memfd");
written = write(fd, data, data_len);
if (written == -1)
err(1, "cannot write data to memory area");
copy1 = mmap(NULL, data_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
copy2 = mmap(NULL, data_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
printf("%s\n", copy1);
printf("%s\n", copy2);
return 0;
}
$ ./test
test
test
Исходная версия
cumvillain,
:
В сценарии общения один-один всё и правда норм (кроме всратого файлоцентричного API). Нюансы возникают, когда ты хочешь сделать рассылку один-много. В текущем варианте это просто не будет работать без копирования для каждого получателя.
huh?
$ cat test.c
#define _GNU_SOURCE
#include <err.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>
int
main(void)
{
int fd;
const char *data = "test";
const size_t data_len = strlen(data) + 1;
size_t written;
const char *copy1, *copy2;
fd = memfd_create("data", 0);
if (fd == -1)
err(1, "cannot create memfd");
written = write(fd, data, data_len);
if (written == -1)
err(1, "cannot write data to memory area");
copy1 = mmap(NULL, data_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
copy2 = mmap(NULL, data_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
printf("%s\n", copy1);
printf("%s\n", copy2);
return 0;
}
$ ./test
test
test