Независимый от платформы захват файла?

bindsym $mod+n exec "xdotool keyup n; xdotool key --clearmodifiers Prior;"

Вам также необходимо отправить событие keyup для привязки клавиш и модификатора. в этом случае нам понадобится keyup n и - clearmodifiers по второй команде.

6
задан dsimcha 20 March 2009 в 23:19
поделиться

5 ответов

По NFS Вы сталкиваетесь с некоторыми проблемами с клиентским кэшированием и устаревшими данными. Я записал независимый от операционной системы модуль блокировки для работы по NFS прежде. Простая идея создать [файл данных] .lock файл не работает хорошо по NFS. Основная идея работать вокруг этого состоит в том, чтобы создать файл блокировки [файл данных] .lock, который, если существующий файл средств НЕ заблокирован и процесс, который хочет получить блокировку, переименовывает файл к другому имени как [файл данных] .lock. [имя хоста]. [pid]. Переименовывание является достаточно атомарной операцией, которая работает достаточно хорошо по NFS для гарантии исключительности блокировки. Остальное - в основном набор безопасного сбоя, циклы, проверка ошибок и извлечение блокировки в случае, если процесс умирает прежде, чем выпустить блокировку и переименовать файл блокировки назад к [файлу данных] .lock

7
ответ дан 8 December 2019 в 17:27
поделиться

Классическое решение состоит в том, чтобы использовать файл блокировки или более точно каталог блокировки. На всем общем OSs, создающем каталог, атомарная операция, таким образом, стандартная программа:

  • попытайтесь создать каталог блокировки с фиксированным именем в фиксированном месте
  • если неудавшееся создавание, ожидайте приблизительно секунда и попробуйте еще раз - повторение до успеха
  • запишите свои данные в реальный файл данных
  • удалите каталог блокировки

Это использовалось приложениями, такими как CVS много лет через многие платформы. Единственная проблема происходит в редких случаях когда Ваши сбои приложения при записи и прежде, чем удалить блокировку.

2
ответ дан 8 December 2019 в 17:27
поделиться

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

Затем, если бы Вы когда-нибудь хотели изменить формат данных, то необходимо было бы только изменить сервер и не все клиенты.

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

2
ответ дан 8 December 2019 в 17:27
поделиться

Я не знаю D, но меня вещь с помощью взаимоисключающего файла, чтобы сделать, jobe мог бы работать. Вот некоторый псевдокод, который Вы могли бы найти полезным:

do {
  // Try to create a new file to use as mutex.
  // If it's already created, it will throw some kind of error.
  mutex = create_file_for_writing('lock_file');
} while (mutex == null);

// Open your log file and write results
log_file = open_file_for_reading('the_log_file');
write(log_file, data);
close_file(log_file);

close_file(mutex);
// Free mutex and allow other processes to create the same file.
delete_file(mutex); 

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

1
ответ дан 8 December 2019 в 17:27
поделиться

Файл блокировки со скручиванием

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

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

Таким образом, последовательность для записи в файл данных была бы:

  1. Проверьте, существует ли существующий файл блокировки

  2. Если существует файл блокировки, посмотрите - ли я тот, владеющий им путем проверки, что его содержание имеет мой идентификатор.
    Если это так, просто запишите в файл данных, затем удаляют файл блокировки.
    Если это не так просто ожидайте секунда или маленький случайный отрезок времени и попробуйте целый цикл снова.

  3. Если нет никакого файла блокировки, создайте один с моим идентификатором и попробуйте целый цикл снова для предотвращения состояния состязания (перепроверьте, что файл блокировки является действительно моим).

Наряду с идентификатором, я записал бы метку времени в файле блокировки и проверил бы, является ли это более старым, чем данное значение тайм-аута.
Если метка времени слишком стара, то предположите, что файл блокировки является устаревшим, и просто удалите его, поскольку это было бы mea, который, возможно, разрушил один из ПК, пишущего в файл данных, или его соединение, возможно, было потеряно.

Другое решение

Если Вы сознаете ситуацию формат файла данных, мог бы быть должен зарезервировать структуру в начале файла, чтобы записать, заблокировано ли это или нет.
Если Вы просто резервируете байт с этой целью, Вы могли бы принять, например, это 00 означал бы, что файл данных не заблокирован, и что другие значения представили бы идентификатор машины, в настоящее время пишущий в него.

Проблемы с NFS

Хорошо, я добавляю несколько вещей, потому что Jiri Klouda правильно указал, что NFS использует клиентское кэширование, которое приведет к фактическому файлу блокировки, находящемуся в неопределенном состоянии.

Несколько способов решить эту проблему:

  • смонтируйте каталог NFS с noac или sync опции. Это легко, но не полностью гарантирует непротиворечивости данных клиента и сервера хотя, таким образом, могут все еще быть проблемы, хотя в Вашем случае это может быть в порядке.

  • Откройте файл блокировки или файл данных с помощью O_DIRECT, O_SYNC или O_DSYNC атрибуты. Это, как предполагается, отключает кэширование в целом.
    Это понизит производительность, но гарантирует непротиворечивость.

  • Вы можете использовать flock() заблокировать файл данных, но его реализацию является пятнистым, и необходимо будет проверить, использует ли конкретная ОС на самом деле сервис блокировки NFS. Это не может сделать ничего вообще иначе.
    Если файл данных будет заблокирован, то другой клиент, открывающий его для записи, перестанет работать.
    О, да, и это, кажется, не работает над долями SMB, таким образом, вероятно, лучше просто забыть об этом.

  • Не используйте NFS и просто используйте Samba вместо этого: существует хорошая статья о предмете и почему NFS является, вероятно, не лучшим ответом на Ваш сценарий использования.
    Вы также найдете в этой статье различные методы для блокировки файлов.

  • Решением Джири является также хорошее.

В основном, если Вы хотите сохранить вещи простыми, не используйте NFS для часто обновленных файлов, которые совместно использованы среди нескольких машин.

Что-то другое

Используйте маленький сервер базы данных, чтобы сохранить Ваши данные в и обойти проблемы блокировки NFS/SMB в целом или сохранить Ваш ток несколькими системой файлов данных и просто записать маленькую утилиту для конкатенации результатов.
Это может все еще быть самое безопасное и простое решение Вашей проблемы.

2
ответ дан 8 December 2019 в 17:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: