Я пытаюсь передать данные из одного UDS в другой как можно быстрее в программе на C ++, но UDS не поддерживает сращивание (как fd_in). Существуют ли альтернативы, которые поддерживаются UDS, которые максимально приближены к нулевому копированию?
Этот вопрос был задан вопрос о сокетах UDP, но они не нашли альтернативы сращиванию.
Это длинный выстрел, но я думаю, что помню, когда fuse
получен низкоуровневый интерфейс splice()
служба поддержки.
Таким образом, вы можете реализовать драйвер предохранителя, чтобы делать то, что вы хотите. Тем не менее, это имеет смысл, только если вы настоять наличие интерфейса, совместимого с дескриптором файла. Я подозреваю, что это нетривиальный объем работы, хотя проект, как ntfs-3g
может иметь это
реализованы.
Теперь, что вы пытаетесь достичь?
По моему опыту, доменные сокеты UNIX предназначены только для внутрипроцессного взаимодействия между процессами, и есть вероятность, что потребители данных на самом деле не заинтересованы в файловой / потоковой природе интерфейса.
Если достаточно просто передать данные, вы можете использовать mmap
с splice
Вот:
int fd;
char tmpfile[] = "/tmp/fooXXXXXX";
void *buffer;
int pfd[2];
ssize_t bytes;
fd = mkostemp(tmpfile, O_NOATIME);
unlink(tmpfile);
lseek(fd, 4095, SEEK_SET);
write(fd, "", 1);
lseek(fd, 0, SEEK_SET);
buffer = mmap(NULL, 4096, PROT_READ, MAP_PRIVATE, fd, 0);
pipe(pfd);
bytes = splice(s, NULL, pfd[1], NULL, 4096, SPLICE_F_MOVE);
splice(pfd[0], NULL, fd, NULL, bytes, SPLICE_F_MOVE);
ВНИМАНИЕ: Помните, что при объединении данных из буфера mmap в сетевой сокет невозможно сказать, когда все данные были отправлены. Даже если splice()
возвращает, сетевой стек, возможно, еще не отправил все данные. Поэтому повторное использование буфера может перезаписать неотправленные данные.
Справочная информация от это HowTo
Других решений пока нет …