2012-02-17 5 views
2

C++ : 다른 프로세스/클래스/장치에서 쓰기 위해 파일이 열려 있는지 확인하는 방법이 있습니까?C++ 파일이 사용 중인지 확인하는 방법 - 멀티 스레드 다중 프로세스 시스템

다른 프로세스에서 쓰기 위해 액세스 할 수있는 폴더에서 파일을 읽으려고합니다. 동시에 쓰는 파일을 읽으면 읽기 및 쓰기 프로세스에서 오류가 발생합니다 (작성이 불완전하여 헤더 만 얻을 수 있음). 특정 파일을 열지 여부를 결정하기 전에 일부 유형의 조건을 확인해야합니다. 저는 boost :: filesystem을 사용하여 파일 목록을 가져 왔습니다. 나는 유닉스와 윈도우 모두와의 호환성을 원한다.

+0

가장 유용한 답변 중 하나를 '수락'하십시오. 이것은이 질문이 충분히 응답되었고, 응답자에게 조금 "감사합니다"라는 것을 보여줍니다. 사람들은 실제로 대답을 '수락하는'사람들의 질문에 대답하는 것을 선호합니다. – jammon

답변

2

파일 자물쇠을 사용해야합니다. Unix에서는 flock이고, Windows에서는 LockFile입니다.

그러나 읽는 중 프로세스에서 오류가 발생한다는 것은 해당 프로세스에서 읽기 전용 모드로 파일을 열지 않았 음을 나타냅니다. 읽기 전용 액세스 또는 OS의 관점에서 올바른 플래그를 지정해야합니다. 두 개의 작성자가 있습니다.

두 운영 체제는 무제한 독자가 허용되지만 독자가 없을 때만 독자 및 자용 자 잠금을 지원하며 한 번에 최대 하나의 작성자 만 액세스 할 수 있습니다.

(가 간 공유 메모리 않는 한) 당신이 당신의 시스템이 다중 과정 (즉, 다중하지 스레드)라고 때문에,이 조건 변수를 사용할 수 없습니다. 또한 소켓 또는 공유 메모리를 통해 데이터를 셔틀 링하지 않는 한 코디네이터로 단일 작성자를 사용할 수 없습니다.

1

제가 알고있는 바로는 boost::filesystem에서 요청한 작업을 수행하기 위해 해당 기능 세트에서 필요한 세분성을 얻지 못할 것입니다. 일반적으로, 두 개의 서로 다른 접근 방식 취할 수있다 :

  1. 는 파일 시스템 레벨에서 세마포어 볼 수라는 이름으로 동기화 메커니즘을 사용
  2. 을 사용하여 파일 잠금 (POSIX 시스템 즉, fcntl 또는 flock)

불행히도 두 가지 접근법은 플랫폼에 따라 다르며 적어도 POSIX와 Win32에 한정됩니다.