2013-04-09 2 views
3

Системный вызов vmsplice позволяет реализовать передачу нулевой копии в канал с набора страниц пользовательского уровня с использованием флага «SPLICE_F_GIFT». Мой вопрос заключается в том, есть ли обратная операция, например, могу ли я иметь процесс на другом конце трубы, который не просто read(), либо aio_read(), но вместо этого выполняет операцию, которая просто сопоставляет данные, передаваемые по каналам, в его адресное пространство? Это в конечном итоге означает передачу (перемещение) отображения памяти от отправителя к процессу приемника без какого-либо копирования. Это возможно?Есть ли обратная операция для системного вызова vmsplice() в Linux?

Редактировать: My use case выглядит следующим образом. У меня есть два процесса A и B. A генерирует данные (> мегабайты) и хочет передать их B для дальнейшей обработки, а затем завершает работу. Я бы хотел избежать копирования и просто сказать ядро ​​«Послушай, у меня есть эти страницы здесь, и они больше не нужны. Пожалуйста, прикрепите их к адресному пространству B и сделайте с ним. '.

Простая общая память не работает для меня, потому что память, отправленная A, может находиться где угодно в своем адресном пространстве, если я не ограничу A для использования определенного распределителя памяти, который работает с файлами разделяемой памяти или временными файлами, как избежать.

+0

Вы ищете 'mmap' дескриптора трубы? –

+0

Не совсем. Я хотел бы отправить разные сопоставления через один и тот же канал. – BjoernD

+0

Я не совсем понимаю ваш случай использования. Не могли бы вы объяснить, что и как вы хотите достичь? –

ответ

3

Я думаю, что вы ищете process_vm_readv и process_vm_writev.

Эти системные вызовы передачи данных между адресным пространством вызывающего процесса («местного процесса») и процесса , идентифицированной PID («удаленный процесс»). Данные перемещаются непосредственно между адресными пространствами двух процессов, не передавая через пространство ядра.

Подробнее см. На странице руководства.

+0

достаточно близко. Благодарю. :) – BjoernD

0

Нет никакой обратной операции vmsplice, теперь идет проект для помещения DBUS в ядро, которое вы можете захотеть взглянуть на него. У меня тоже есть такое же требование, и я изучал всю эту vmsplice вещь.

+1

DBUS не спрашивает, похоже, я думаю. –

Смежные вопросы