LINUX.ORG.RU

История изменений

Исправление 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