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 시간 동안이 문제에 봉착했습니다.
아무도이 문제가 무엇인지 잘못 알 수 있습니까?
'lockf'가 방금 0이 아닌 값을 반환 한 * 곳에 * strerror (errno)를 인쇄하도록 프로그램을 변경하십시오. 그들을 다시 실행하십시오. 그들이 무엇을 인쇄하는지 알려주십시오. – zwol
0이 아닌 값을 반환하지 않습니다. 로그는 제자리에 있지만 항상 반환되기 때문에 인쇄되지 않습니다. 이제 로그에 대한 변경 사항을 코드로 편집하십시오. – naren
파일을 열어 둘 필요가 없도록 일종의 객체를 만들어야하지 않습니까?'is_file_locked()'에서는 파일 디스크립터를 열지 만 닫지 않습니다. 당신은 파일 기술자를 다 써 버릴 것이다. 'lock_file()'이나'unlock_file()'에서 파일 디스크립터를 닫지는 않지만 파일을 닫을 때 락커에 onus를 남긴다. 소멸자와 RAII는 삶을 더 간단하게 만들 것입니다. –