после rm -R /tmp/.X11-unix ничего особенного не происходит?

Я узнаю кое-что о X11. И мне было интересно, что произойдет, если я удалю каталог «/tmp/.X11-unix». Я пробовал, но на самом деле ничего особенного не произошло. Каждое приложение с графическим интерфейсом работает без изменений. Почему ?

Я думал, что X-клиент взаимодействует с X-сервером через доменный сокет unix, а путь к сокету — «/tmp/.X11-unix/X0».

Моя ОС Ubuntu 14.04.

Любая помощь будет оценена.


person waterbully    schedule 25.06.2015    source источник


Ответы (2)


То, что запись в файловой системе удалена, не означает, что файловый дескриптор перестает работать.

Когда приложение GUI запускается, оно подключается к /tmp/.X11-unix/X0 и получает дескриптор файла. Отныне он использует файловый дескриптор, /tmp/.X11-unix/X0 больше не нужен этому приложению и, следовательно, если вы его удалите, с запущенными приложениями ничего не произойдет.

Однако попытка запустить новые приложения больше не сработает.

В Linux есть расширение, позволяющее использовать имена, не привязанные к файловой системе: абстрактные имена, описание см. в unix(7). Поскольку они не используют файловую систему, не имеет значения, была ли запись файловой системы удалена.

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

person Meixner    schedule 24.07.2015

X-сервер создает каталог и открывает сокет в этом каталоге. Клиенты не открывают сокет напрямую, а используют функцию connect (которая ссылается на путь устройства сокета). Сокет продолжает существовать до тех пор, пока он открыт процессом X-сервера. Подсказка находится в этой формулировке со страницы руководства connect:

Системный вызов connect() соединяет сокет, на который ссылается файловый дескриптор sockfd, с адресом, указанным в addr. Аргумент addrlen указывает размер адреса. Формат адреса в addr определяется адресным пространством сокета sockfd; см. socket(2) для получения дополнительной информации.

То есть адрес, указанный в вызове connect, не обязательно является путем к файловой системе, который приложения могут проверить другими способами, а просто известен ядру, когда приложения запрашивают открытие файла сокет.

person Thomas Dickey    schedule 26.06.2015
comment
Спасибо за Ваш ответ. Но я все еще немного запутался, не могли бы вы показать мне пример? Я предполагаю, что приложение с графическим интерфейсом должно иметь следующий код: /* создать сокет / int sockfd = socket(AF_UNIX, SOCK_STREAM, 0); структура sockaddr_un адрес; address.sun_family = AF_UNIX; strcpy(адрес.sun_path, /tmp/.X11-unix/X0); // подключение к серверу */ int result = connect(sockfd, (struct sockaddr *)&address, sizeof(address)); - person waterbully; 26.06.2015
comment
X не открывает путь к файловой системе. Он открывает сокет. Здесь находится указатель на Код Xcb, который вы, возможно, захотите изучить. - person Thomas Dickey; 27.06.2015