파일 락에 대해서 ..고수님들 알려주세요
글쓴이: heojaes / 작성시간: 수, 2005/10/05 - 6:02오후
제가 만들고 있는 파일락을 설정하는 부분을 코딩하고 있는데..
첫번째파일 filelog1.txt에 락설정하고 해제 했는데..
두번째파일 filelog2.txt를 열고 락체크를 하면 락이 되어 있다고 나오는데 왜 락이 걸려 있는지 알수가 없습니다.
고수님들 알려 주십시오.
그부분만 따로 만들어서 올립니다.
코드:
main() { char test1[512], test2[512]; int i, ret = 0; strcpy(test1, "filelog1.txt"); strcpy(test2, "filelog2.txt"); for(i = 0 ; i < 2 ; i++) { /* 데이타 처리 루틴 */ if( i == 0) ret = FileLock(test1); else if ( i == 1) ret = FileLock(test2); } } FileLock(char *filename) { int fd, ret = 0; FILE *fp; struct flock stLock; char strReadBuff[512]; fp = fopen(filename, "r"); fd = fileno(fp); /* 파일에 락이 걸려있는지 검사 */ if (fcntl(fd, F_GETLK, &stLock) == 0) { printf("Logfile %s is Locked!\n", filename); fclose(fp); exit(0); } /* file에 락을 건다. Read Lock 설정 값 */ stLock.l_type = F_RDLCK; /* 읽기 락 설정 */ stLock.l_whence = 0; /* 0:화일의처음, 1:현재의 위치, 2화일의 끝 */ stLock.l_start = 0; /* 잠금영역의 시작 위치*/ stLock.l_len = 0; /* 화일 주소 공간 전체 */ stLock.l_pid = getpid(); if (fcntl(fd, F_SETLKW, &stLock) == -1) { printf("Logfile %s is Lock Fail!\n", filename); fclose(fp); exit(0); } /* Data 처리 루틴 */ while(fgets(strReadBuff, sizeof strReadBuff, fp) != NULL) { printf("Data[%s]\n", strReadBuff); } /* 파일의 Lock 을 푼다. */ stLock.l_type = F_UNLCK; if (fcntl(fd, F_SETLKW, &stLock) == -1) { printf("Logfile %s is unLock Fail!\n", filename); } fclose(fp); return (ret); }
위와 같이 코딩을 하고 있는데..
첫번째 test1 파일을 찾아서 락을 건후에 그내용 끝까지 읽은후에 락설정을 해제하고, 끝난후 다음파일인 test2를 읽어서 첫번째랑 같이 돌아가는데.
파일을 읽기전에 fcntl(fd, F_GETLK, &stLock) 함수로 락이 설정이 되어 있는지 검사를 하는데 두번째 파일로 넘어가서 읽을때는 락이 걸려있다고 나옵니다.
여러 책이나 예제 소스를 봐도 stLock.l_type = F_UNLCK; 으로 값셋팅후 fcntl(fd, F_SETLKW, &stLock)를 다시 하면 락이 풀린다고 나와 있는데 어떻게 해결을 해야 하는지 알려주십시오.
두파일이 모두 락이 설정이 되는것 같다는 생각이 듭니다.
Forums:
소스 긁어다 해보니까 잘 되는데요? 참고로,gcc 3.2.2
소스 긁어다 해보니까 잘 되는데요?
참고로,
gcc 3.2.2
glibc-2.3.2-11.9 입니다.
잘된다는 말은 무슨말인지?
잘된다는 말은 무슨말인지요?
락이 잘 건린다는 말인가요..어느부분을 말하는것인지?
이예제 소스는 파일의 레코드에 락설정하기전에 락이 되어 있는지 체크를 하고 락이 되어 있으면 종료하고 락설정이 되어 있지 않으면 락을 설정한후 파일의 내용을 끝까지 출력하고 락설정을 해제하고 두번째 파일로 가서 처음과 똑같이 돌아가는 예제입니다.
그런데 두번째 파일 filelog2.txt는 읽어들이지 못하고
락이 걸렸다는 메시지 출력후 종료됩니다.
원래는 filelog1.txt, filelog2.txt의 내용 모두를 출력을 해야 되어야 하는데 두번째 filelog2.txt이 락이 설정되어 있다고 종료가 됩니다.
재스옹
* 원론적인 얘기로 돌아가서 하시고 싶은게 무엇인가요?혹시?로그파
* 원론적인 얘기로 돌아가서 하시고 싶은게 무엇인가요?
혹시?
로그파일 다수개(각 파일에 대해, 1번의 처리만 해야함) -> 다수 개 프로세스가 로그파일을 읽어서 처리
이렇게 하기 위해 락을 걸고 ... 했다? 인가요?
* 올려주신 코드로봐서는 별문제없이(심지어 락도 필요없이) 돌겠는데... 다수개 프로세스로 수행된다면 잠시 고려사항이 생길듯합니다.
다수개 프로세스가 처리하기위한 목적입니다.
원래는 2개 프로세스가 돌면서 처리하기 위해서 인데..
파일이 락이 설정되어 있으면 다음 파일을 처리하기 위해서 입니다.
테스트를 하려구 락이상태체크부분에 exit(0) 해서 락체크가 잘 되는지 테스트를 하려구 한것입니다.
여러책이나 제가 올린 코드를 살펴봐도 문제가 없는것 같은데..
실제로 돌려보면..
다수의 프로세스가 아니더라도..
하나만 돌려도 2번재 파일(filelog2.txt)로 넘어가서는 filelog2.txt의 내용을 출력해야 되는데 처리가 안되고 락이 걸려있다고 나옵니다.
왜 그런지 알수가 없네요..파일처리후에 UNLOCK을 설정했는데도 그럽니다.
그리고 멀티로 돌릴려고 Data처리루틴에서
무한 while문을 추가하고 프로그램을 실행하여 무한 메시지를 출력하고
똑같이 두번째로 프로그램을 실행하면 락이 걸려있다고 화면에 출력하고 종료를 해야되는데..똑같이 무한 메시지 출력합니다..
결국 두번째 프로그램에서는 첫번째에 실행해서 파일에 락을 건 상태가 체크가 안됩니다.
재스옹
1) 로그파일을 액세스하는 프로세스가 1개인게 맞습니까?* 로그파일에
1) 로그파일을 액세스하는 프로세스가 1개인게 맞습니까?
* 로그파일에 기록하는 프로세스가 돌고 있는것은 아닌지?
루트로
# lsof | grep filelog2.txt
...
2) shared lock과 exclusive lock에 대해서 재고해 보세요.
각각 무엇인지? 둘의 차이점은? 각각의 방식으로 lock을 거는 방법?
멀티프로세스로 만들려구 합니다.
똑같이 동작하는 프로그램을 2개 실행 시킬려구 합니다.
첫번째 프로그램이 동작하고 filelog1.txt 파일에 락을 설정하고 있으면
두번째 프로그램이 동작할때 filelog1.txt이 락이 설정되어 있는지 확인하고 락이 되어 있으면 filelog2.txt 파일로 넘어가서 처리하가 위해서 입니다.
락체크부분에 exit(0)로 테스트했는데 실제는 return을 주어서 2번째 파일로 넘어가려구 합니다.
그런데 두번째 프로그램을 동작하면 filelog1.txt가 락이 설정이 안된 상태가되어 첫번째 프로그램하고 똑같이 동작을합니다.
실제로 동작되는 소스니 한번 해보시고 답글을 남겨주세요.
#include <fcntl.h> 헤더 추가 하시고 txt파일 아무내용이나 입력하고 만들어서 해보십시오.
눈으로 코드를 보면 아무 문제가 없는데 실행을 하면 원하는 결과가 안나옵니다.
재스옹
댓글 달기