2013-08-03 2 views
0

두 개의 프로세스가 있다고 가정합니다. 항상 메모리에 상주하며 디스크의 파일에서 주기적으로 일부 설정을 읽습니다. 설정이 변경된 것을 감지하면 설정이 적용됩니다.두 프로세스의 파일에 안전하게 액세스

다른 프로세스는 요청에 따라 명령 줄에서 실행되고 설정을 수정합니다. 따라서 첫 번째 프로세스는 파일을 읽기만하고 두 번째 프로세스는 파일에 쓸 수 있습니다.

파일에 대한 액세스를 동기화하여 첫 번째 프로세스가 항상 일관된 설정을 갖도록해야합니까? 예 : 일부 중간 내용이 아닌 수정 전이나 후에? 그렇다면 C++에서이 작업을 수행하는 가장 간단한 방법은 무엇입니까?

저는 주로 교차 플랫폼 방식에 관심이 있습니다. 그러나 Windows 및/또는 Linux 전용 프로그램에 대해서도 궁금합니다.

답변

1

디스크에서 파일을 편집하기 전에 명명 된 세마포어를 사용하고 세마포어를 유지하는 프로세스가 필요합니다. 명명 된 세마포는 실행중인 응용 프로그램과 연결할 수 있습니다.

리눅스 컴퓨터에서 명명 된 세마포어에 대한 자세한 내용은 man 7 sem_overview을 참조하십시오. 등이 있는지 확인하기 위해 POCO, Boost, ACE, 그리고 -

내가 찾을 수있는 창문에서 가장 가까운 상응하는 당신은 너무 당신의 첫번째 옵션은 일반적인 크로스 플랫폼 libs와를 통해 확인해야한다 C++를 사용하는 http://msdn.microsoft.com/en-us/library/windows/desktop/ms682438(v=vs.85).aspx

1

입니다 이미 필요한 것을하는 어떤 것도 있습니다.

실제로 두 가지 문제가 있습니다 : (1) 파일 동기화 및 (2) 알림.

Linux에서는 데몬이 파일이 변경되었는지 지속적으로 폴링하지 않으려면 inotify calls을 사용하고 명령 줄 프로그램에서 파일이 변경된시기를 알려주는 이벤트를 설정할 수 있습니다. CL prog가 아마도 파일을 열고, 변경하고 닫을 것이므로 IN_CLOSE_WRITE 이벤트를 찾는 것이 가장 간단 할 것입니다.

동기화의 경우 두 프로그램 모두를 제어하므로 파일 또는 레코드 잠금을 사용할 수 있습니다. lockf, flock 또는 fcntl.

0

가장 확실한 해결책은 파일을 단독 모드로 여는 것입니다. 파일을 열 수 없으면 잠시 기다렸다가 파일을 다시 열어 봅니다. 이렇게하면 액세스/수정 충돌이 발생할 수 있습니다.

이 접근법의 장점은 간단하고 큰 단점이 없다는 것입니다.

물론 OS (OS에 따라 Mutex, Semaphore)를 사용할 수도 있지만, 시나리오가 신속하게 응답 할 필요가 없을 때 과도한 공격이 될 수 있습니다 (열린 시도 사이에 200msec 대기, 구성 파일이 더 이상 소요되지 않습니다).

관련 문제