QLockFile Class
QLockFile 클래스는 파일을 사용하여 프로세스 간 잠금을 제공합니다. 더 보기...
헤더: | #include <QLockFile> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
- 상속된 멤버를 포함한 모든 멤버 목록
- QLockFile은 입력/출력 및 네트워킹의 일부입니다.
공용 유형
enum | LockError { NoError, LockFailedError, PermissionError, UnknownError } |
공용 함수
QLockFile(const QString &fileName) | |
~QLockFile() | |
QLockFile::LockError | error() const |
QString | fileName() const |
bool | getLockInfo(qint64 *pid, QString *hostname, QString *appname) const |
bool | isLocked() const |
bool | lock() |
bool | removeStaleLockFile() |
void | setStaleLockTime(int staleLockTime) |
(since 6.2) void | setStaleLockTime(std::chrono::milliseconds staleLockTime) |
int | staleLockTime() const |
(since 6.2) std::chrono::milliseconds | staleLockTimeAsDuration() const |
bool | tryLock(int timeout) |
(since 6.2) bool | tryLock(std::chrono::milliseconds timeout = std::chrono::milliseconds::zero()) |
void | unlock() |
상세 설명
잠금 파일은 여러 프로세스가 동일한 리소스에 동시에 액세스하는 것을 방지하는 데 사용할 수 있습니다. 예를 들어 디스크의 구성 파일이나 소켓, 포트, 공유 메모리 영역 등이 이에 해당합니다.
직렬화는 공유 리소스에 액세스하는 모든 프로세스가 동일한 파일 경로로 QLockFile을 사용하는 경우에만 보장됩니다.
QLockFile은 단기 작업(예: 새 설정을 저장하기 전에 구성 파일이 변경되었는지 확인)을 위한 리소스 보호와 리소스(예: 사용자가 편집기에서 연 문서)를 무기한으로 보호하는 장기 보호의 두 가지 사용 사례를 지원합니다.
단기간 동안 보호할 때는 lock()를 호출하고 실행 중인 작업이 완료될 때까지 기다릴 수 있습니다. 그러나 리소스를 장시간 보호할 때는 항상 setStaleLockTime()를 호출한 다음 tryLock()을 짧은 시간 동안 호출하여 사용자에게 리소스가 잠겨 있음을 경고해야 합니다(0ms).
잠금을 유지하는 프로세스가 충돌하면 잠금 파일이 디스크에 남아 다른 프로세스가 공유 리소스에 액세스할 수 없게 됩니다. 이러한 이유로 QLockFile은 파일에 기록된 프로세스 ID를 기반으로 이러한 "오래된" 잠금 파일을 감지하려고 시도합니다. 그 사이에 프로세스 ID가 재사용된 상황을 커버하기 위해 현재 프로세스 이름과 잠금 파일의 프로세스 ID에 해당하는 프로세스 이름을 비교합니다. 프로세스 이름이 다르면 잠금 파일은 오래된 것으로 간주됩니다. 또한 잠금 파일의 마지막 수정 시간(수명이 짧은 작업의 사용 사례의 경우 기본적으로 30초)도 고려됩니다. 잠금 파일이 오래된 것으로 확인되면 삭제됩니다.
따라서 장기간 리소스를 보호하는 사용 사례의 경우 setStaleLockTime(0)을 호출하고 tryLock()이 LockFailedError 을 반환하면 사용자에게 문서가 잠겨 있음을 알리고 자세한 내용은 getLockInfo()을 참조하세요.
참고: Windows에서 이 클래스는 컴퓨터의 호스트 이름에 US-ASCII 문자 집합을 벗어난 문자가 포함된 경우 부실 잠금을 감지하는 데 문제가 있습니다.
멤버 유형 문서
enum QLockFile::LockError
이 열거형은 lock() 또는 tryLock()에 대한 마지막 호출의 결과를 설명합니다.
Constant | 값 | 설명 |
---|---|---|
QLockFile::NoError | 0 | 잠금을 성공적으로 획득했습니다. |
QLockFile::LockFailedError | 1 | 다른 프로세스가 잠금을 보유하고 있기 때문에 잠금을 획득할 수 없습니다. |
QLockFile::PermissionError | 2 | 상위 디렉터리에 권한이 부족하여 잠금 파일을 만들 수 없습니다. |
QLockFile::UnknownError | 3 | 전체 파티션으로 인해 잠금 파일을 쓸 수 없는 등의 다른 오류가 발생했습니다. |
멤버 함수 문서
QLockFile::QLockFile(const QString &fileName)
새 잠금 파일 객체를 생성합니다. 객체는 잠금 해제된 상태로 생성됩니다. lock () 또는 tryLock()을 호출하면 fileName 이라는 잠금 파일이 아직 존재하지 않는 경우 생성됩니다.
[noexcept]
QLockFile::~QLockFile()
잠금 파일 객체를 삭제합니다. 잠금을 획득한 경우 잠금 파일을 삭제하여 잠금을 해제합니다.
QLockFile::LockError QLockFile::error() const
파일 잠금 오류 상태를 반환합니다.
tryLock()가 false
을 반환하면 이 함수를 호출하여 잠금이 실패한 이유를 확인할 수 있습니다.
QString QLockFile::fileName() const
잠금 파일의 파일명을 반환합니다.
bool QLockFile::getLockInfo(qint64 *pid, QString *hostname, QString *appname) const
잠금 파일의 현재 소유자에 대한 정보를 검색합니다.
tryLock()가 false
을 반환하고 error()가 LockFailedError 을 반환하는 경우 이 함수를 호출하여 기존 잠금 파일에 대한 자세한 정보를 찾을 수 있습니다:
- 애플리케이션의 PID( pid 에 반환됨)
- 실행 중인 hostname (네트워크 파일시스템의 경우 유용함),
- 해당 파일을 생성한 애플리케이션의 이름( appname)으로 반환됩니다,
tryLock()는 실행 중인 애플리케이션이 없는 경우 자동으로 파일을 삭제하므로 LockFailedError 은 이 PID를 가진 애플리케이션이 있는 경우에만 발생할 수 있습니다(관련이 없을 수도 있음).
이는 사용자에게 기존 잠금 파일에 대해 알리고 삭제할 수 있는 선택권을 주는 데 사용할 수 있습니다. removeStaleLockFile ()를 사용하여 파일을 제거한 후 애플리케이션은 tryLock()를 다시 호출할 수 있습니다.
이 함수는 정보를 성공적으로 검색할 수 있으면 true
을 반환하고, 잠금 파일이 존재하지 않거나 예상 데이터를 포함하지 않으면 false를 반환합니다. tryLock ()가 실패한 시점과 이 함수를 호출한 시점 사이에 잠금 파일이 삭제된 경우 이런 문제가 발생할 수 있습니다. 이 경우 tryLock()를 다시 호출하면 됩니다.
bool QLockFile::isLocked() const
이 QLockFile 인스턴스가 잠금을 획득한 경우 true
를 반환하고, 그렇지 않으면 false
를 반환합니다.
lock(), unlock() 및 tryLock()도 참조하세요 .
bool QLockFile::lock()
잠금 파일을 만듭니다.
다른 프로세스(또는 다른 스레드)가 이미 잠금 파일을 생성한 경우 이 함수는 해당 프로세스(또는 스레드)가 잠금 파일을 해제할 때까지 차단됩니다.
먼저 잠금을 해제하지 않고 동일한 스레드에서 동일한 잠금에 대해 이 함수를 여러 번 호출하는 것은 허용되지 않습니다. 이 함수는 파일이 재귀적으로 잠기면 데드락됩니다.
잠금이 획득된 경우 true
, 상위 디렉터리에 권한이 없는 등 복구할 수 없는 오류로 인해 잠금을 획득할 수 없는 경우 false를 반환합니다.
bool QLockFile::removeStaleLockFile()
기존 잠금 파일을 강제로 제거하려고 시도합니다.
QLockFile 은 이미 staleLockTime() 보다 오래된 잠금 파일 제거를 처리하므로 수명이 짧은 작업을 보호할 때는 이 메서드를 호출하지 않는 것이 좋습니다.
이 메서드는 리소스를 장기간 보호하는 경우, 즉 staleLockTime(0)으로 tryLock()가 LockFailedError 을 반환하고 사용자가 잠금 파일 제거에 동의한 후에만 호출해야 합니다.
성공하면 true
을 반환하고, 잠금 파일을 제거할 수 없으면 false를 반환합니다. 이 함수는 잠금을 소유한 애플리케이션이 계속 실행 중일 때 Windows에서 발생합니다.
void QLockFile::setStaleLockTime(int staleLockTime)
staleLockTime 을 잠금 파일이 오래된 것으로 간주되는 시간(밀리초)으로 설정합니다. 기본값은 30000, 즉 30초입니다. 애플리케이션에서 일반적으로 30초 이상 파일을 잠그는 경우(예: 2분 동안 메가바이트의 데이터를 저장하는 동안) setStaleLockTime()을 사용하여 더 큰 값을 설정해야 합니다.
staleLockTime 값은 lock() 및 tryLock()에서 기존 잠금 파일이 오래된 것으로 간주되는 시점, 즉 크래시된 프로세스에 의해 남겨진 시점을 결정하기 위해 사용됩니다. 이 함수는 그 사이에 PID가 재사용된 경우에 유용하므로 오래된 잠금 파일을 감지하는 한 가지 방법은 파일이 오랫동안 사용되었다는 사실로 확인할 수 있습니다.
이것은 호출에 해당하는 오버로드된 함수입니다:
setStaleLockTime(std::chrono::milliseconds{staleLockTime});
staleLockTime()도 참조하세요 .
[since 6.2]
void QLockFile::setStaleLockTime(std::chrono::milliseconds staleLockTime)
잠금 파일이 오래된 것으로 간주되는 간격을 staleLockTime 으로 설정합니다. 기본값은 30초입니다.
애플리케이션에서 일반적으로 30초 이상 파일을 잠그는 경우(예: 2분 동안 메가바이트의 데이터를 저장하는 동안) setStaleLockTime()을 사용하여 더 큰 값을 설정해야 합니다.
staleLockTime() 값은 lock() 및 tryLock()에서 기존 잠금 파일이 오래된 것으로 간주되는 시점, 즉 충돌한 프로세스에 의해 남겨진 시점을 결정하기 위해 사용됩니다. 이 함수는 그 사이에 PID가 재사용된 경우에 유용하므로, 오래된 잠금 파일을 감지하는 한 가지 방법은 파일이 오랫동안 사용되었다는 사실로 확인할 수 있습니다.
이 기능은 Qt 6.2에 도입되었습니다.
staleLockTime()도 참조하십시오 .
int QLockFile::staleLockTime() const
잠금 파일이 오래된 것으로 간주되는 시간(밀리초)을 반환합니다.
setStaleLockTime()도 참조하세요 .
[since 6.2]
std::chrono::milliseconds QLockFile::staleLockTimeAsDuration() const
이 함수는 오버로드된 함수입니다.
잠금 파일이 오래된 것으로 간주되는 시간을 나타내는 std::chrono::milliseconds 객체를 반환합니다.
이 함수는 Qt 6.2에 도입되었습니다.
setStaleLockTime()도 참조하십시오 .
bool QLockFile::tryLock(int timeout)
잠금 파일을 생성하려고 시도합니다. 이 함수는 잠금을 얻은 경우 true
을 반환하고, 그렇지 않으면 false
을 반환합니다. 다른 프로세스(또는 다른 스레드)가 이미 잠금 파일을 생성한 경우 이 함수는 잠금 파일을 사용할 수 있을 때까지 최대 timeout 밀리초 동안 대기합니다.
참고: 음수를 timeout 으로 전달하는 것은 lock()을 호출하는 것과 같습니다. 즉, timeout 이 음수인 경우 이 함수는 잠금 파일을 잠글 수 있을 때까지 영원히 기다립니다.
잠금이 확보되면 unlock()로 잠금을 해제해야 다른 프로세스(또는 스레드)가 성공적으로 잠글 수 있습니다.
먼저 잠금을 해제하지 않고 동일한 스레드에서 동일한 잠금에 대해 이 함수를 여러 번 호출하는 것은 허용되지 않으며, 재귀적으로 파일을 잠그려고 시도할 때 이 함수는 항상 false를 반환합니다.
[since 6.2]
bool QLockFile::tryLock(std::chrono::milliseconds timeout = std::chrono::milliseconds::zero())
오버로드된 함수입니다.
잠금 파일을 생성하려고 시도합니다. 이 함수는 잠금을 얻은 경우 true
을 반환하고, 그렇지 않으면 false
을 반환합니다. 다른 프로세스(또는 다른 스레드)가 이미 잠금 파일을 생성한 경우 이 함수는 잠금 파일을 사용할 수 있게 될 때까지 최대 timeout 까지 기다립니다.
잠금을 얻은 경우 다른 프로세스(또는 스레드)가 성공적으로 잠그기 전에 unlock()로 잠금을 해제해야 합니다.
먼저 잠금을 해제하지 않고 동일한 스레드에서 동일한 잠금에 대해 이 함수를 여러 번 호출하는 것은 허용되지 않으며, 재귀적으로 파일을 잠그려고 시도할 때 이 함수는 항상 false를 반환합니다.
이 함수는 Qt 6.2에 도입되었습니다.
void QLockFile::unlock()
잠금 파일을 삭제하여 잠금을 해제합니다.
파일을 먼저 잠그지 않고 unlock()을 호출하면 아무 일도 일어나지 않습니다.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.