FileLocker_wo.hне может получить блокировку на файл
#include <string>
namespace Utils
{
namespace FileLocker
{
bool lock_file(std::string aFileName, int& aFileDescriptor);
bool unlock_file(int& aFileDescriptor);
bool is_file_locked(std::string aFileName);
};
}
FileLocker_wo.cpp
namespace Utils
{
namespace FileLocker
{
bool lock_file(std::string aFileName, int& aFileDescriptor)
{
aFileDescriptor = open(aFileName.c_str(), O_RDWR);
if (aFileDescriptor != -1)
{
if (lockf(aFileDescriptor, F_TLOCK, 0) == 0)
{
return true;
}
std::cout << strerror(errno) << std::endl;
}
return false;
}
bool unlock_file(int& aFileDescriptor)
{
if (lockf(aFileDescriptor, F_ULOCK, 0) == 0)
{
std::cout << "unloced file" << std::endl;
close(aFileDescriptor);
return true;
}
close(aFileDescriptor);
return false;
}
bool is_file_locked(std::string aFileName)
{
int file_descriptor = open(aFileName.c_str(), O_RDWR);
if (file_descriptor != -1)
{
int ret = lockf(file_descriptor, F_TEST, 0);
if (ret == -1 && (errno == EACCES || errno == EAGAIN))
{
std::cout << "locked by another process" << std::endl;
close(file_descriptor);
return true;
}
if (ret != 0)
{
std::cout << "return value is " << ret << " " << strerror(errno) << std::endl;
}
}
close(file_descriptor);
return false;
}
}
}
p1.cpp
#include <iostream>
#include <fstream>
#include "FileLocker_wo.h"
int main()
{
int fd = -1;
if (Utils::FileLocker::lock_file("hello.txt", fd))
{
std::ofstream out("hello.txt");
out << "hello ding dong" << std::endl;
out.close();
std::cout << "locked" << std::endl;
sleep(5);
if (Utils::FileLocker::unlock_file(fd))
{
std::cout << "unlocked" << std::endl;
}
}
return 0;
}
p2.cpp
#include "FileLocker_wo.h"
#include <iostream>
#include <fstream>
int main()
{
int max_trys = 2;
int trys = 0;
bool is_locked = false;
do
{
is_locked = Utils::FileLocker::is_file_locked("hello.txt");
if (!is_locked)
{
std::cout << "not locked" << std::endl;
break;
}
std::cout << "locked" << std::endl;
sleep(1);
++trys;
}
while(trys < max_trys);
if (!is_locked)
{
std::string s;
std::ifstream in("hello.txt");
while(getline(in,s))
{
std::cout << "s is " << s << std::endl;
}
}
return 0;
}
Я пытаюсь получить блокировку файла в одном процессе и проверить, есть ли какая-либо блокировка этого файла в другом процессе с помощью lockf (p1.cpp, p2.cpp).
В p1.cpp Я блокирую файл hello.txt и жду 5 секунд. Тем временем я запускаю p2.cpp и проверяю, есть ли какой-либо замок другим процессом, но всегда получается, что нет блокировки> Я застрял с этим в течение последних 2 часов.
Может ли кто-нибудь сказать, что в этом плохого?
Измените свои программы на печать 'strerror (errno)' in * every place * где 'lockf' только что вернул ненулевое значение. Запустите их снова. Расскажите нам, что они печатают. – zwol
не возвращает ненулевое значение. У меня есть журналы на месте, но они не печатаются, потому что они всегда возвращаются 0. редактируя эти изменения журнала теперь в коде. – naren
Разве вы не должны создавать какой-то объект, чтобы не открывать файл?В 'is_file_locked()', вы открываете, но не закрываете дескриптор файла; у вас закончится файловый дескриптор. Вы не закрываете файловый дескриптор в 'lock_file()' или в 'unlock_file()', но это оставляет брандмауэр в замке для закрытия файла (тем самым отпирая файл). Я считаю, что деструктор и RAII сделают жизнь проще. –