LINUX.ORG.RU

Эксклюзивное открытие файла

 


1

1

Мне нужен межпроцесовый мьютекс на базе файла. Возможно ли заблокировать файл от открытия в других процесах? Мне нужен аналог winapi кода:

OpenFile(, , OF_SHARE_EXCLUSIVE|OF_CREATE);
Если процес открывает файл вышеуказаным способом, то любой другой получит ошибку при попытке открыть этот же файл. Я знаю что, что есть flock(), можно заблокировать часть файла, но мне это не подходит, нужно исключить возможность открытия открытого файла (на одной из сторон возможности ограничены, мне доступны только файловые операции).

Описание OF_SHARE_EXCLUSIVE на msdn:

Opens a file with exclusive mode, and denies both read/write access to other processes. If a file has been opened in any other mode for read/write access, even by the current process, the function fails.

★★

Последнее исправление: pavlick (всего исправлений: 1)

Ответ на: комментарий от anonymous

А, извиняюсь, не дочитал сообщение, сразу полез искать ссылку на flock :/

anonymous
()

головой подумать не?

1.создай рядом или в /tmp свой файл XXXX.tmp в который и пиши(но да по прежнему можно изменять,но уже не сам изначальный файл)

2.создай пользователя и назначь файл только для пользователя и запускай программу от пользователя

3.помести файл в память пока работаешь и пиши по окончанию

а виндовая функция лока файла-зло

g1966464
()
Ответ на: комментарий от g1966464

Я ничего не понял, можно подробней? Есть разделямемые данные, нужна синхронизация доступа между процессами на основе файла.

pavlick ★★
() автор топика
Ответ на: комментарий от pavlick

синхронизация между процессами на основе файлов

дай угадаю

ты москаль,госработник нод «нацос на основе линукса»

боже

откуда такие вылазят

g1966464
()

chmod-ом права поменять попробуй. Только вот

The effect on file descriptors for files open at the time of a call to chmod() is implementation-defined.

SZT ★★★★★
()

O_EXCL - Если установлены оба флага O_EXCL и O_CREAT, то системный вызов open завершается неудачей, если файл уже существует.

anonymous
()

В общем, сдела небольшой костылёк: -Первое приложение получает доступ, когда удаляет «mutex» директорию, отдаёт доступ, когда создаёт «mutex» директорию. -Второе приложение получает доступ, когда создаёт «file» в «mutex» директории, отдаёт доступ, когда удаляет «file» из «mutex» директории.

Первое не может удалить директорию до тех пор, пока в ней есть файл. Второе не может создать файл до тех пор, пока нет директории.

Первое приложение - моё, второе - lua скрипт, который работает под wine.

Тестовые писульки:

constexpr char name[] = "/home/pavlick/tlua";

int main()
{
    while(true)
    {
        if( rmdir(name) == 0  ||  errno == ENOENT)
        {
            cout << "accessed" << endl;
            this_thread::sleep_for(chrono::seconds(2));
            if(mkdir(name, S_IRWXU) != 0)
                cout << "mkdir error" << endl;
            this_thread::sleep_for(chrono::seconds(5));
        }
        else
        {
            cout << "--------" << endl;
        }
        this_thread::sleep_for( chrono::milliseconds(1) );
    }
}
//----------------------lua-------------------------
fname = "/home/pavlick/tlua/lua_file"

function main()
    while true do
        res = io.open(fname, "w")
        if res ~= nill then
            message("accessed")
            sleep(2000)
            res:close()
            dres, ddes = os.remove(fname)
            if dres == nil then
                message(ddes)
            end
            sleep(2000)
        else
            message("------------")
        end
        sleep(500)
    end
end
Вроде работет.

pavlick ★★
() автор топика

Спасибо всем (кроме g1966464).

pavlick ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.