2010-06-14 5 views
2

리눅스 커널 2.4 (숙제)에서 FTP와 비슷한 프로토콜을 구현 중이며, 다른 어떤 파일을 열려고 시도하는 파일을 열어 본 경우 쓰레드가 실패 할 때까지 기다렸다가 실제로 시도해 보았습니다.쓰레드가 같은 파일에 쓰지 못하도록하기

어떻게 이런 일이 발생하지 않도록 할 수 있습니까?

추신 : 나는 파일을 열 때 open()을 사용하고 있습니다.

PS2 : 기존 파일에 액세스 할 수 있어야합니다. 나는 그것들이 동시에 쓰여지는 것을 막고 싶다.

+0

대기. 리눅스 커널에서 이것을하고 있습니까? 사용자 모드 프로세스 (즉 커널 안)가 아니라면 동일한 프로세스 내에서 다른 스레드를 사용하고 있습니까 (즉, fork()를 사용하고 있습니까?). –

+0

나는 이것을 사용자 모드에서하고있다. 나는 커널 정보가 실제로 중요하지 않다고 생각하지만 커널간에 파일을 여는 방법과 관련하여 구현시 미묘한 버그/차이점이 있는지 확인하려고했습니다. – EpsilonVector

+0

스레드 (pthread 또는 친족)와 프로세스 (즉, 포크)는 어떻습니까? 나는 당신이 대답을 받아 들였다는 것을 알고 있습니다 ... 여전히 미래의 독자들을 도울 것입니다, 그렇습니다. –

답변

2

열려있는 파일의 목록을 유지 한 다음 파일을 열기 전에 다른 스레드에서 이미 열 었는지 확인할 수 있습니다. 이 접근법의 몇 가지 문제는 다음과 같습니다.

  • 목록이 스레드로부터 안전한지 확인하려면 Mutex와 같은 동기화 프리미티브를 사용해야합니다.

  • 프로그램이 끝나면 파일을 목록에서 제거해야합니다.

1

시스템 수준 파일 잠금은 프로세스 기반이므로 사용할 수 없습니다. 프로세스 레벨 잠금을 사용해야합니다. 예를 들어, pthreads를 사용하여 mutex (잠금)를 정의합니다.

1

open()에는 O_CREATE 및 O_EXCL 플래그를 사용하십시오. 이렇게하면 파일이 이미 있으면 호출이 실패합니다.

+0

기존 파일에 액세스 할 수 있어야하므로이 기능이 작동하지 않습니다. 나는 그것들이 동시에 쓰여지는 것을 막고 싶다. – EpsilonVector

관련 문제