Я нашел обходной путь, который работает для меня в Debian Buster с GNOME Shell версии 3.30 и с Lightdm. Я понятия не имею, сломает ли это что-нибудь, но я не заметил ничего необычного.
cinnamon-screensaver
/usr/bin/cinnamon-screensaver
в приложения для запуска cinnamon-screensaver-command -l
В AT&T Unix и исторически в BSD существовали только процессы, а не потоки; и каждая запись в таблице процессов состояла из двух частей: структуры struct proc
и структуры struct user
. Первый всегда находился в памяти ядра. Последний может быть заменен как часть замены процесса. (Помните, это было в те дни, когда Unices фактически обменивались вещами, а не требовали -выдачи их.)
Структура struct user
была также известна как «область u». Это произошло потому, что в результате некоторого умного отображения памяти структура текущего процесса user
всегда находилась по одному и тому же фиксированному виртуальному адресу в памяти ядра, и на нее можно было ссылаться в коде через глобальный символ u
(, а не через указатель. ).
Структура содержала всевозможные вещи, которые просто не нужны ядру, когда процесс не является текущим процессом, включая маску создания файла, открытую таблицу файловых дескрипторов, ограничения ресурсов и так далее. Он содержал адреса обработчиков сигналов , нужных только тогда, когда процесс запущен и пытается вызвать обработчик, но не маску заблокированных сигналов или набор ожидающих сигналов,оба из них необходимы, когда процесс заменяется и, таким образом, были в struct proc
. В некоторых Unices он даже содержал аргументы для текущей операции ввода-вывода, а не передавался по стеку.
Конечно, причины для такой конструкции уже давно не актуальны. К концу 80-х они практически устарели. В конце концов, глобальная переменная и умное отображение памяти были заменены простой косвенностью через указатель. Вы обнаружите, что struct user
все еще существует в заголовочных файлах библиотеки C на BSD (в <sys/user.h>
), но это в основном для совместимости исходного кода. В XNU она объявлена как пустая структура. FreeBSD отмечает , что он присутствует главным образом потому, что он используется в дампах ядра для выполнения в формате a.out. Linux даже не существовал до тех пор, пока идея не устарела, и он вообще не работает таким образом.
В этом дизайне были некоторые вариации. Например, :AT&T Unix System 5 имела «расширенную пользовательскую область», struct euser
, на которую указывало поле u_euserp
структуры u
, где располагались некоторые вещи. Это иллюстрирует еще один момент. Все переменные-члены struct user
называются u_something
в соответствии с соглашениями о кодировании ядра C того времени и его ранними языковыми правилами. Это считается причиной того, что umask
назван так , хотя это не точно.