130 likes | 420 Views
리눅스 시스템 프로그래밍. Ex4-7 2007242081 유재훈. lockf. 레코드 로킹 기법 중 가장 단순함 프로세스에 대한 모든 잠금은 프로세스 종료시 해제 Int lockf(int fildes, int function, long size) == ( Int lockf(int fd, int cmd, off_t len) ) Fildes(fd) : 개방된 파일 디스크립터 Function(cmd) : 실행될 동작을 지정하는 제어값 Size(len) : locking 할 데이터의 크기. lockf.
E N D
리눅스 시스템 프로그래밍 Ex4-7 2007242081 유재훈
lockf • 레코드 로킹 기법 중 가장 단순함 • 프로세스에 대한 모든 잠금은 프로세스 종료시 해제 • Int lockf(int fildes, int function, long size) == ( Int lockf(int fd, int cmd, off_t len) ) • Fildes(fd) : 개방된 파일 디스크립터 • Function(cmd) : 실행될 동작을 지정하는 제어값 • Size(len) : locking 할 데이터의 크기
lockf • F_ULOCK(0) : 이미 lock된 레코드를 unlocking • F_LOCK(1) : 배타적 사용을 위해 레코드를 locking 이미 lock되어 있으면 잠금해제 대기 (block) • F_TLOCK(2) : 레코드를 locking 확인(Test) 후 locking이미 lock되어 있으면 block되지 않고 실패 (return -1) • F_TEST(3) : 다른 lock들을 위해 레코드를 확인(Test) lock되어 있지 않으면 0, lock되어 있으면 -1 리턴
open • 열기실패시 -1반환, 성공시 파일디스크립터 (장치 = 파일) • int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); • Pathname : 현재 디렉토리 내 파일명 or 절대경로 • Flags : 접근 목적 / 접근방법 • flags의 값들 = 상호배타적 • 여러 개의 값을 주어야 하는 경우에는 비트 OR연산자 ’|’ 사용 ex) 파일생성과 파일내용지움과 쓰기모드: open(fd, O_CREAT | O_TRUNC | O_WRONLY); • mode : 퍼미션설정
open - mode • flags와 같이 OR연산으로 조합해서 사용가능 ex) open(fd, O_RDWR, S_IWRITE | S_IREAD);
소스 • #include <stdio.h> // C, C++ Standard I/O • #include <stdlib.h> // C, C++ Standard Library • #include <fcntl.h> // file control (open & close) • #include <unistd.h> // Linux Standard I/O • #include "ex2-3.h“ // employee 구조체 관련 • int main(int argc, char* argv[]) • { • struct employee record; • struct flock lock; • int fd, pid, getpid(), recnum; • long position; • if((fd = open(argv[1], O_RDWR)) == -1) // 파일 열기 실행 • { // 파일 열기 실패시 동작 • perror(argv[1]); // 에러 메세지 • exit(1); // 종료 • } • pid = getpid(); // 프로세스 ID를 pid에 저장
소스 • for(;;) { • printf("\nEnter record number: "); • scanf("%d",&recnum); • if(recnum < 0) // 0 미만 값 입력시 반복문 종료 • break; • position = recnum * sizeof(record); // 선택한레코드 위치 • lseek(fd,position, 0); // 파일포인터 이동 • if(lockf(fd, F_LOCK, sizeof(record))== -1) // 해당 레코드 잠금 • { // 잠금 실패시 동작 • perror(argv[1]); // 에러메세지 • exit(2); // 종료 • } • if(read(fd, (char *) &record,sizeof(record)) == 0) // 레코드 읽기 • { // 읽기 실패시 동작 • printf("record %d not found\n",recnum) // 레코드없음을 통보 • lseek(fd,position, 0); // 위치 이동 • lockf(fd,F_UNLCK, sizeof(record)); // 잠금 해제 • continue; // 계속 실행 • }
소스 • printf("Employee: %s, salary: %d\n",record.name,record.salary); • record.pid = pid; /* update record */ // pid 갱신 • printf("Enter new salary: "); • scanf("%d", &record.salary); // salary 값 입력 • lseek(fd, position, 0); // 레코드 위치 • write(fd, (char *) &record, sizeof(record)); // 레코드 기록 • lseek(fd, position, 0); // 레코드 위치 • lockf(fd, F_UNLCK, sizeof(record)); // 잠금 해제 • } • close(fd); // 파일 닫기 • }
참 조 • 참조 자료 • Ex4-6.c • 예제로 배우는 리눅스 프로그래밍 완성 (p. 148 ~ p. 153) • 참조 사이트 • Lockf http://cafe.naver.com/androidworld.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=28& • Open http://sumanaki.tistory.com/128