1 / 11

리눅스 시스템 프로그래밍

리눅스 시스템 프로그래밍. 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.

shad-adams
Download Presentation

리눅스 시스템 프로그래밍

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 리눅스 시스템 프로그래밍 Ex4-7 2007242081 유재훈

  2. 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 할 데이터의 크기

  3. 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 리턴

  4. 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 : 퍼미션설정

  5. open - flags

  6. open - mode • flags와 같이 OR연산으로 조합해서 사용가능 ex) open(fd, O_RDWR, S_IWRITE | S_IREAD);

  7. 소스 • #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에 저장

  8. 소스 • 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; // 계속 실행 • }

  9. 소스 • 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); // 파일 닫기 • }

  10. 실행 결과

  11. 참 조 • 참조 자료 • 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

More Related