File 에서 Read할때 락 걸수 있는 방법이 없을까요?
글쓴이: metalwolf / 작성시간: 목, 2004/07/22 - 11:06오전
안녕하세요... 궁금중이 있어서 여쭤 봅니다.
두 프로세스 간에 한 File을 공유 합니다. 파일의 데이터 각각의 라인을 '레코드'라 칭하겠습니다.
궁금한 것은 두 프로세스 간에 Read 할때 레코드를 선점 할수 있냐는 거죠.
write는 락이 걸리니까 문제는 없는데 Read에서는 기본적으로 락이 걸리지
않아 난감합니다. 데이터베이스를 사용할 수 없고 순수하게 파일을 데이터
베이스 처럼 사용하려 하기 때문에 발생된 문제 입니다. 혹시 저같은 사례를
겪으셔서 해결 하신 분은 리필 꼭 부탁드립니다.
아 환경은 Solaris 입니다.
^____^;
Forums:
"write는 락이 걸리니까 문제는 없는데 Read에서는 기본적으로 락이
"write는 락이 걸리니까 문제는 없는데 Read에서는 기본적으로 락이 걸리지 않아 난감합니다" 라는 말씀이 이해가 잘 가질 않는군요.
기본적으로 파일의 read/write에는 lock이 존재하질 않습니다.
fcntl을 이용하면 원하시는 record lock을 구현하실 수 있으실 듯합니다.
struct flock {
short l_type; /* lock operation type */
short l_whence; /* lock base indicator */
off_t l_start; /* starting offset from base */
off_t l_len; /* lock length; l_len == 0 means
until end of file */
long l_sysid; /* system ID running process holding lock */
pid_t l_pid; /* process ID of process holding lock */
}
처음부터 20byte까지의 data를 read locking 하고 싶으시면.. (현재 file을 open한 바로 직후였다고 가정하고) 아래는 대강의 코드입니다.
struct flock lock;
lock.l_type = F_RDLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_end = 20;
lock.l_pid = getpid();
fcntl(fd, F_SETLK, &lock); // record에 read lock.
.............
lock.l_type = F_UNLCK;
fcntl(fd, F_SETLK, &lock); // record에서 read lock 해제.
기억나는데로 적은거라서 실수가 있을지도 모르겠습니다. 보다 정확한 내용은 man fcntl 해보시길 바랍니다.
간단히
간단히 lockf 를 이용하셔도 됩니다.
마지막은 size옵션인데..man page를 참조하세요.
답변 감사합니다. 헌데 문제는 두 프로세스가 물리적으로 분리 되어 있다는
답변 감사합니다. 헌데 문제는 두 프로세스가 물리적으로 분리 되어 있다는
겁니다. emc 장비로 파일 시스템을 공유 하고 물리적으로 다른 두 프로세스가
공유를 한다는 거죠. 그럼 위 함수들은 물리적으로 다른 프로세스가 서로 락을
걸어도 보장 해 주는 건가요? 그리고 만약 보장해 준다면 락을 걸어놓고 그 프로
세스가 죽었을시 어떻게 해야 되는건가요? 제 말은 파일시스템에 락이 존재
하는지 알고 싶습니다. os차원 이나 프로세스 차원 으로선 두 프로세스가 한
서버에 있는게 아니라서요.. 답변 꼭 부탁드립니다. ^^;
^____^; 방가여
댓글 달기