Мне нужен межпроцесовый мьютекс на базе файла.
Возможно ли заблокировать файл от открытия в других процесах?
Мне нужен аналог 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.
В общем, сдела небольшой костылёк:
-Первое приложение получает доступ, когда удаляет «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