2012-04-21 4 views
2

나는 서버 웹을 쓰고있다.flock(), fgets() : 하위 레벨 잠금, stdio 라이브러리 함수 읽기/쓰기. 가능한가?

각 연결은 개별 스레드에 의해 처리되므로 스레드 수를 미리 알 수는 없습니다.

또한 텍스트 파일 그룹 (숫자도 모름)이 있으며 각 스레드는 각 파일을 읽고 쓸 수 있습니다.

한 번에 한 스레드 만 파일을 쓸 수 있지만 다른 스레드가 동시에 다른 파일에 쓸 수 있습니다.

하나 이상의 스레드에서 파일을 읽는 경우 (동시 읽기 가능) THAT 파일에 쓰는 스레드가 없습니다.

이제이 (Thread safe multi-file writing) 해결책을 발견했지만 fgets()와 같은 함수도 사용하고 싶습니다.

그래서 flock() 파일을 만든 다음 fgets() 또는 다른 stdio 읽기/쓰기 라이브러리 함수를 사용할 수 있습니까?

답변

2

우선 이 아니라 fcntl을 사용하십시오. 후자는 표준이 아닌 비표준 BSD 함수이며 NFS 및 다른 파일 시스템에서 작동하지 않습니다. 반면에 fcntl 잠금은 POSIX 표준이며 으로 지정되어 있습니다.

stdio와 혼합 된 파일 수준의 판독기 기록기 잠금을 사용하려는 경우 작동하지만 잠금 기능이 잠금에 대한 가정을 깨뜨리지 않도록주의해야합니다. 제가 설명하려고하는 방법은 단 한가지는 아니지만 가장 명확하고 단순한 것 같습니다 :

stdio로 파일 중 하나를 조작하고 올바른 잠금 유형을 얻으려면 (읽기 또는 쓰기 , 일명 독점 공유)은 fopen 이후에하는 첫 번째 작업입니다. fileno을 사용하여 파일 설명자 번호를 가져 와서 잠금을 적용하십시오. 그런 다음 전체 읽기 또는 쓰기 작업을 수행하십시오. 파일 잠금을 해제하지 마십시오. 대신 파일을 닫으려면 fclose으로 전화하고 닫을 때 암시 적으로 잠금 해제되도록하십시오. 그렇지 않으면 버퍼링되지 않은 데이터가 아직 쓰여지지 않은 상태에서 잠금을 해제하거나 나중에 잠금이 해제되기 전에 버퍼 된 데이터를 읽거나 잠금 해제 후에 더 이상 유효하지 않은 데이터를 읽을 수 있습니다.

+0

'fcntl' 잠금의 또 다른 보너스는 프로세스 종료시 자동으로 해제된다는 것입니다 (외부에서 강제 종료되거나 버그가 발생하여 seg-faulting 또는 유사한 문제로 종료되는 경우 포함). – torek

+0

다른 스레드가 동일한 파일을 열면 서로 다른 파일 설명자를 얻을 수 있습니까? 그렇지 않다면 어떤 쓰레드가 파일 디스크립터를 닫고 다른 쓰레드는 그 잠금을 잃으면'fcntl' beacuse를 사용할 수 없습니다. – JustTrying

+0

네, 그들은 다른 파일 기술자를 얻습니다,하지만 당신이 문제가 그 잠금이 풀릴 때마다 동일한 ** 파일 ** (뿐만 아니라 파일 설명을 열고, ** 파일 **)을 참조하는 모든 디스크립터가 릴리스 될 것이라고 생각 : "지정된 프로세스에 대한 파일과 관련된 모든 잠금은 해당 파일에 대한 파일 설명자가 해당 프로세스에 의해 닫히거나 해당 파일 설명자를 보유한 프로세스가 종료되면 제거됩니다." –