70 likes | 270 Views
리눅스 시스템 프로그래밍. Ex4-7 2002242060 안경환. lockf. 레코드 로킹 기법 중 가장 단순하다 . Int lockf(int fildes, int function, long size) Fildes : 개방된 파일 디스크립터 Function : 실행될 동작을 지정하는 제어값 Size : 사이즈. lockf. F_ULOCK(0) : 이미 lock 된 레코드를 unlocking 한다 . F_LOCK(1) : 배타적으로 사용하기 위해 레코드를 locking 한다 .
E N D
리눅스 시스템 프로그래밍 Ex4-7 2002242060 안경환
lockf • 레코드 로킹 기법 중 가장 단순하다. • Int lockf(int fildes, int function, long size) • Fildes : 개방된 파일 디스크립터 • Function : 실행될 동작을 지정하는 제어값 • Size : 사이즈
lockf • F_ULOCK(0) : 이미 lock된 레코드를 unlocking 한다. • F_LOCK(1) : 배타적으로 사용하기 위해 레코드를 locking한다. • F_TLOCK(2) : 레코드를 locking하기 전에 테스트를 하 고 locking 한다.이미 lock되어 있으면 호출은 block되지 않고 실패한다. • F_TEST(3) : 다른 lock들을 위해 레코드를 테스트 한다.
소스 • #include <fcntl.h> • #include <unistd.h> • #include “ex2-3.h” • main(argc, argv) • int argc; • char *argv[]; • { • struct employee record; • struct flock lock; • int fd, open(), pid, getpid(), recnum; • long position; • if((fd = open(argv[1], O_RDWR)) == -1) { • perror(argv[1]); • exit(1); • } • pid = getpid();
소스 • for(;;) • { • printf("\nEnter record number: "); • scanf("%d",&recnum); • if(recnum < 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 */ printf("Enter new salary: "); scanf("%d", &record.salary); lseek(fd, position, 0); write(fd, (char *) &record, sizeof(record)); lseek(fd, position, 0); lockf(fd, F_UNLCK, sizeof(record)); } close(fd); }