2011-07-27 3 views
5

this 질문을 찾았습니다. 기능이 _locking()입니다. 그게 Locks or unlocks bytes of a file (실제로 나는이 문장이 실제로 의미하는 것을 이해할 수 없다)을 알려줍니다. 누군가이 기능을 사용한 경험이 있다면 첫 번째 질문에서 설명한 문제를 해결하는 기능을 사용할 수 있습니까?_locking()이 실제로하는 일은 무엇입니까?

답변

1

은 MSDN 페이지에 링크 된 인용 :

int _locking(
    int fd, 
    int mode, 
    long nbytes 
); 

기능의 잠금을 _locking 또는 nbytes FD에 의해 지정된 파일의 바이트 잠금을 해제합니다. 파일에서 바이트를 잠그면 다른 프로세스가 해당 바이트에 액세스하지 못하게합니다. 모든 잠금 또는 잠금 해제는 파일 포인터의 현재 위치에서 시작하여 다음 nbytes 바이트로 진행됩니다. 파일 끝에서 바이트를 잠글 수 있습니다.

+0

예, 읽었습니다. 하지만 파일을 잠그려고 할 때 같은 과정에서 ofstream을 통해 파일에 쓸 수 없었습니다. 그렇다면 바이트 잠금은 실제로 무엇을 의미합니까? –

+0

아니면 Win7에서 제대로 작동하지 않습니까? –

0

http://msdn.microsoft.com/en-us/library/8054ew2f(v=vs.71).aspx

나는이 문제 Race condition를 "해결"하는 데 도움이 발견!

파일에 마지막으로 작성한 사람이 승리합니다. 전체 파일을 잠글 이유가없는 파일의 첫 번째 절반 만 읽으면됩니다.

파일 크기를 바이트 단위로 가져 와서이 함수로 전달한 다음 잠급니다.

성공하면 함수는 0을 반환합니다. 반환 값 -1은 실패를 나타내며,이 경우 errno는 MSDN 페이지에서 알려주는 값으로 설정됩니다.

당신은 다음 파일의 크기를 가지고 그것을 잠글 수 있습니다 귀하의 질문에

에 응답하려면하지만 당신은 단지 파일을 형성 읽을 수 있습니다. 일종의 읽기 모드로만 잠급니다.

레이스 조건의 위키에서는 파일을 잠그는 방법의 예를 들어 설명합니다.이 경우 두 번째 프로세스에서 해당 플래그가 작동하는지 확인할 수 있습니다.

1

단순히 파일 잠금을 획득하는 프로세스를 독점적으로 사용하기 위해 파일 범위를 예약합니다. 잠금 호출이 성공하면 파일의 해당 부분을 읽거나 쓰려고하는 다른 프로세스가 실패합니다. 이를 통해 여러 프로세스가 동일한 파일에 액세스하고 일관된 방식으로 업데이트 할 수 있습니다. 그것은 파일의 범위에 대한 뮤텍스와 같은 종류입니다.

기본적으로 파일의 일부를 원자 적으로 업데이트 할 수 있으므로 파일을 읽거나 쓰는 다른 프로세스는 모든 업데이트를 보거나 변경하지 않습니다. 읽기에도 적용됩니다. 읽기를 원할 때 다른 프로세스가 파일의 일부를 변경하지 못하도록 읽기 원하는 범위의 파일을 잠글 수 있습니다.

그러나 프로세스는 오류 또는 지연없이 파일의 다른 부분에 계속 액세스 할 수 있습니다.

_lock() on이 (는) 프로세스 세분성으로 작동하므로이 질문에서 언급 한 문제가 해결되지 않습니다. 스레드 A가 파일 범위를 잠그면 동일한 프로세스의 스레드 B는 여전히 해당 범위를 읽고 쓸 수 있습니다.동일한 프로세스의 다른 스레드가 파일 범위에 액세스하지 못하도록하려면 프로세스가 파일 범위가 다른 스레드에 의해 잠겨 있다는 것을 고려하여 자체 내부 메커니즘을 구현해야합니다. 적어도 나는 Win32 API에서 그렇게하지 않는 것을 모르고있다. (내가 알지 못하는 것이있을 수있다.)

+0

이 함수는 모든 쓰기 작업을 파일 형식으로 잠그고 해당 바이트 형식으로만 읽을 수 있도록합니다. 사용자는 파일을 입력하기 전에 글로브 인 스레드 플래그를 쉽게 추가 할 수 있습니다. –

+0

@Dennis : 문서에 따르면 잠금은 범위에 대한 읽기 또는 쓰기 액세스를 차단합니다. 그렇지 않으면 증명하기 위해 몇 가지 테스트를 실행해야합니다. 프로세스 A가 파일의 레코드를 변경하면 프로세스 B는 업데이트가 완료 될 때까지 레코드를 읽지 않으려 고합니다. –

+0

@Dennis : 또한 '플래그 추가'가 얼마나 쉬운지를 과대 평가하지 마십시오. 스레드 간 액세스 검사가 파일 범위를 세분화하도록하려면 어떤 범위가 잠겨 있는지 나타내는 일종의 데이터 구조를 유지해야하며 해당 데이터에 대한 액세스를 관리하기 위해 동기화 메커니즘 (중요한 섹션 객체 또는 기타)이 필요합니다. 구조. 깃발을 확인하는 것만큼이나 사소한 일은 아닙니다. 또한 필요할 때마다 * 액세스 확인을 명시 적으로 추가해야합니다. 적절한 시간에 검사를 수행하지 않으면 스레드 A가 스레드를 잠근 동안 스레드 B가 범위에 액세스합니다. –

0

다른 프로세스가 파일의 동일한 부분에 액세스하지 못하게합니다.

+0

액세스는 읽기 액세스를 포함합니까? – smerlin

+0

@ 스머 린 : 예; 그것은 독점적 인 것입니다. – Mehrdad

관련 문제