Разговор демона FUSE X11, безусловно, был бы возможен. Но есть и другие проблемы:
Nitpick: "Первичный буфер обмена" противоречит сам себе. X11 имеет два обычно используемых "выбора"; тот, который называется "PRIMARY", используется, когда вы выбираете и нажимаете среднюю кнопку, а тот, который называется "CLIPBOARD", используется, когда вы нажимаете Ctrl C или Ctrl V.
Cygwin /dev/clipboard
реализован во время выполнения cygwin1, поэтому его код работает в том же контексте, что и сама программа, осуществляющая доступ. Если два пользователя пытаются прочитать его, они оба видят свое собственное содержимое буфера обмена, потому что они получают к нему доступ напрямую.
Тем временем монтирование файловой системы Linux является глобальным - все запросы на чтение проходят через один серверный процесс FUSE (для этого монтирования FUSE); это означает, что он не знает наверняка, какой буфер обмена X-сервера он должен прочитать.
(Помните, что в систему могут войти несколько пользователей и одновременно запустить несколько X-серверов.)
Существует три возможных решения многопользовательской проблемы:
Имейте единственное общесистемное крепление FUSE в /dev/clipboard
. Каждый раз, когда демон FUSE получает открытый запрос, ему нужно получить PID запрашивающей программы, access /proc/<pid>/environ
, извлечь из него DISPLAY = & XAUTHORITY =, использовать эту информацию для подключения к нужному X-серверу и прочитайте буфер обмена
Вместо /dev поместите специальный файл в домашнюю директорию пользователя, например, ~/clipboard
. Каждый пользователь запускает отдельную копию демона. Gvfs из GNOME использует этот метод для /run/user/*/gvfs
(ранее ~/.gvfs
). Он ограничивает каждого пользователя одним графическим сеансом, но это нормально - есть много других вещей, которые работают только один раз для каждого пользователя.
Настройте новое пространство имен монтирования при входе в систему, например, используя pam_namespace
, чтобы у каждого сеанса было отдельное представление о том, что смонтировано где (наследование от корневого пространства имен, но возможность монтировать, например, /dev /clipboard, не видя из вне). Затем демон FUSE запускается диспетчером сеансов X так же, как и в предыдущем методе, но не ограничивается одним сеансом на пользователя.