Оптимальный метод файла блокировки

Самый легкий способ заставить это работать состоит в том, чтобы добавить"! важный" для CSS для гарантии его приоритета (если у Вас нет нескольких! важные правила):

td {
    padding-left: 10px !important;
} 

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

34
задан BartoszKP 3 September 2015 в 22:47
поделиться

4 ответа

Взгляните на поучительную презентацию Уловки и ловушки блокировки файлов :

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

Изменить: Чтобы ответить на ваши вопросы более точно:

Есть ли лучший метод синхронизации, чем файл блокировки?

Как уже упоминал @Hasturkun и как сказано в презентации выше, система вызов, который вам нужно использовать, это flock (2) . Если ресурс, которым вы хотите поделиться между многими пользователями, уже основан на файлах (в вашем случае это / dev / ttyUSBx ), вы можете скопировать сам файл устройства .

Как определить, работает ли еще процесс, создавший файл блокировки?

Вам не нужно это определять, поскольку блокировка flock -ed будет автоматически снята при закрытии дескриптора файла, связанного с вашим файлом, даже если процесс был завершен.

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

Если вы заблокируете сам файл устройства, то удалять этот файл не нужно. Даже если вы решите заблокировать обычный файл в / var / lock , с flock вам не нужно будет удалять файл, чтобы снять блокировку.

36
ответ дан 27 November 2019 в 16:32
поделиться

Вам, вероятно, следует использовать flock () , как в

fd = open(filename, O_RDWR | O_CREAT, 0666); // open or create lockfile
//check open success...
rc = flock(fd, LOCK_EX | LOCK_NB); // grab exclusive lock, fail if can't obtain.
if (rc)
{
    // fail
}
22
ответ дан 27 November 2019 в 16:32
поделиться

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

Преимущества этого подхода в том, что в отличие от многие другие методы синхронизации программ, ОС должна привести вас в порядок, если ваша программа завершится без разблокировки.

Таким образом, структура программы будет примерно такой:

1: open the lock file creating it if it doesn't exist
2: ask for an exclusive lock an agreed byte range in the lock file
3: when the lock is granted then
    4: <do my processing here>
    5: release my lock
    6: close the lock file
end

На шаге: вы можете либо заблокировать, ожидая предоставления блокировки или вернуться немедленно. Блокируемые байты на самом деле не обязательно должны существовать в файле. Если вы можете получить копию Advanced Unix Programming Марка Дж. Рочкинда, он разработает полную библиотеку C, которая использует этот метод для обеспечения способа синхронизации программ, которые, тем не менее, приводятся в порядок ОС. программы выходят.

2
ответ дан 27 November 2019 в 16:32
поделиться

Ответ Хастуркуна поставил меня на правильный путь.

Вот код, который я использую

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <fcntl.h>

/*! Try to get lock. Return its file descriptor or -1 if failed.
 *
 *  @param lockName Name of file used as lock (i.e. '/var/lock/myLock').
 *  @return File descriptor of lock file, or -1 if failed.
 */
int tryGetLock( char const *lockName )
{
    mode_t m = umask( 0 );
    int fd = open( lockName, O_RDWR|O_CREAT, 0666 );
    umask( m );
    if( fd >= 0 && flock( fd, LOCK_EX | LOCK_NB ) < 0 )
    {
        close( fd );
        fd = -1;
    }
    return fd;
}

/*! Release the lock obtained with tryGetLock( lockName ).
 *
 *  @param fd File descriptor of lock returned by tryGetLock( lockName ).
 *  @param lockName Name of file used as lock (i.e. '/var/lock/myLock').
 */
void releaseLock( int fd, char const *lockName )
{
    if( fd < 0 )
        return;
    remove( lockName );
    close( fd );
}
8
ответ дан 27 November 2019 в 16:32
поделиться
Другие вопросы по тегам:

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