Linux System Programming

Slides:



Advertisements
Similar presentations
Linux System Programming
Advertisements

Database Laboratory, Hong Ik University
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Linux System Programming
제2부 시스템 프로그래밍 파일 및 입출력 2011 가을 숙명여대 창병모 © 숙대 창병모.
08. 디바이스 드라이버의 읽기와 쓰기 김진홍
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
제2장. 파일 입출력 (File I/O) © 숙대 창병모.
6 프로세스 생성과 실행.
Department of Computer Science and Engineering
조 병 규 Software Quality Lab. 한국교통대학교
Linux System Programming
레이스 컨디션.
Unix Project2 <test character device 생성>
제 12장 I/O멀티플렉싱(Multiplexing)
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
Linux System Programming
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
12장 파이프.
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
07. 디바이스 드라이버의 초기화와 종료 김진홍
레이스 컨디션 컴퓨터공학과 4학년 이교욱.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
프로세스 생성[1] 프로그램 실행 : system(3) #include <stdlib.h>
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
시스템 호출 read , write의 효율성 lseek test example – test1.c 실습 – 연습문제 2.8
Linux/UNIX Programming
파이프와 exec 시스템 호출 (ls | wc)
파일 기술자 복사 파일 기술자 복사 : dup(2) 파일 기술자 복사 : dup2(3)
8 메모리 매핑.
Advanced Socket Programming
파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
(ioctl, mmap, fsync&flush)
4장 파일.
임베디드 실습 # LED, 7’Segment 제어
6장 파일 및 레코드 잠금.
파일 접근권한 제어 stat 구조체의 st_mode 항목에 파일의 종류와 접근권한 정보저장 st_mode 값의 구조.
FILE I/O 번째주 Dept. of Computer Science & Engineering
03. 병행 프로세스 (Parallel Process)
11장. 1차원 배열.
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
Department of Computer Engineering
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
13장 프로세스 사이의 통신.
UNIT 07 Memory Map 로봇 SW 교육원 조용수.
Memory & Data Management.
27장. 모듈화 프로그래밍.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
2장. 데이터베이스 관리 시스템 데이터베이스 관리 시스템의 등장 배경 데이터베이스 관리 시스템의 정의
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
19. 함수 포인터와 void 포인터.
Chapter 4 MPEG-2 부호기 전체 구조와 알고리즘 ( 4.6 ~ 4.10 )
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
School of Electronics and Information. Kyung Hee University.
Stepper Motor 디바이스 드라이버
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Linux/UNIX Programming
Homework 7… 마지막 수업시간까지 (실습) 매개변수로 입력 받아 처리할 수 있도록 수정해 보세요
Fucntion 요약.
( Windows Service Application Debugging )
13주 실습강의 학기, 소프트웨어 설계 및 실험(Ⅰ).
3. 모듈 (5장. 모듈).
구조체(struct)와 공용체(union)
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
제 4 장 Record.
Department of Computer Engineering
06. 디바이스의 등록과 해제 김진홍
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
 6장. SQL 쿼리.
Presentation transcript:

Linux System Programming Lecture #4 – 파일과 레코드 록킹

레코드 록킹 (1) 레코드 록킹(Record Locking) 레코드 록킹의 필요성 두 개 이상의 프로세스가 하나의 파일 데이터(레코드)를 동시에 접근하지 못하도록 제어하는 것 프로세스가 자신의 배타적인 사용을 위해 파일의 일부를 임시로 보존할 수 있게 하여 데이터베이스 관리 등에서 발생하는 문제를 해결하도록 지원 레코드 록킹의 필요성 예: 기차표 예약 시스템 이유: 여러 개의 프로세스가 동시에 linux 파일을 접근하여 파일 쓰기 연산이 가능하기 때문 해결책: 프로세스가 현재 사용중인 파일의 일부를 로킹하여 다른 프로세스가 그 데이터를 접근할 수 없도록 지원 Linux System Programming

레코드 록킹 (2) 레코드 록킹 연산 하나의 프로세스가 공유 파일에 쓰기 위해 파일의 일부를 록킹(locking)한다 록킹된 파일 부분을 레코드라고 함 파일 쓰기를 수행하고 레코드 록킹을 해제한다 파일이 록킹되어 있는 동안 다른 프로세스는 록킹된 레코드에 쓰기 연산을 수행할 수 없다 레코드 록킹 연산은 원자적으로(atomic) 수행된다 레코드 록킹 연산을 수행동안 프로그램 수행이 중지되지 않음을 의미 Linux System Programming

레코드 록킹 (3) 레코드 록킹 시스템 호출 fcntl() lockf() 최초의 레코드 록킹 시스템 호출 유닉스 사용자 그룹의 표준 위원회에 의해 채택 fcntl() AT&T의 System-V 버전에서 지원 lockf() 보다 더 일반적인 형태의 레코드 록킹을 수행 Linux System Programming

fcntl() 시스템 호출 (1) fcntl() 시스템 호출 파일 제어 호출 함수 2가지 형태의 레코드 록킹을 제공 파일의 기본적인 연산(읽기, 쓰기) 이외의 추가적인 파일 제어 연산을 제공하는 시스템 호출 레코드 록킹 제어 연산을 지원 2가지 형태의 레코드 록킹을 제공 읽기 록킹 록킹된 구역(segment)에 대해 읽기 연산은 가능하나 쓰기 연산을 허용하지 않는 록킹 연산 여러 프로세스가 같은 구역에 대해 동기에 읽기 록킹이 가능 쓰기 록킹 록킹된 구역(segment)에 대해 다른 프로세스의 읽기 및 쓰기 연산을 허용하지 않는 록킹 연산 파일의 한 구역에 대해서는 단지 하나의 쓰기 록킹만 가능 Linux System Programming

fcntl() 시스템 호출 (2) fcntl() 시스템 호출 Linux System Programming

fcntl() 시스템 호출 (3) fcntl() 시스템 호출 레코드 록킹 명령 Linux System Programming

fcntl() 시스템 호출 (4) fcntl() 시스템 호출 레코드 록킹 명령의 파라미터 : #include <fcntl.h> struct flock { short l_type; // 레코드 록킹 유형 short l_where; // lseek와 같음 long l_start; // 잠금 영역의 시작 위치 long l_len; // 잠금영역의 크기 short l_sysid; // F_GETLK에서 유효 shoprt l_pid; // F_GETLK에서 유효 }; Linux System Programming

fcntl() 시스템 호출 (5) 예제 프로그램 4-2: vi로 파일을 편집하는 동안에 다른 사용자가 편집중인 파일에 접근하지 못하도록 lock시키는 프로그램 작성 #include <fcntl.h> #include <errno.h> main(argc, argv) int argc; char *argv[]; { struct flock lock; int fd, open(), fcntl(); char command[100]; if ((fd = open(argv[1], O_RDWR)) == -1) { perror(argv[1]); exit(1); } Linux System Programming

fcntl() 시스템 호출 (6) lock.l_type = F_WRLCK; lock.l_whence = 0; lock.l_start = 0L; lock.l_len = 0L; /* whole file address space */ if (fcntl (fd, F_SETLK, &lock) == -1) { if (errno == EACCES) { printf("%s busy -- try later\n", argv[1]); exit(2); } perror(argv[1]); exit(3); sprintf(command, "vi %s\n", argv[1]); system(command); lock.l_type = F_UNLCK; /* unlock file */ fcntl(fd, F_SETLK, &lock); close(fd); Linux System Programming

fcntl() 시스템 호출 (7) 예제 프로그램 4-3: 예제 2-3의 employee 레코드를 수정하는 프로그램 작성하되, 레코드를 읽기 전에 lock하고 수정한 후에 unlock하도록 한다. #include <fcntl.h> #include "ex2-3.h" main(argc, argv) int argc; char *argv[]; { struct flock lock; struct employee record; int fd, open(), pid, getpid(), recnum; long position; if((fd = open(argv[1], O_RDWR)) == -1) { perror(argv[1]); exit(1); } Linux System Programming

fcntl() 시스템 호출 (8) pid = getpid(); for(;;) { printf("\nEnter record number: "); scanf("%d",&recnum); if(recnum < 0) break; position = recnum * sizeof(record); lock.l_type = F_WRLCK; /* lock record */ lock.l_whence = 0; lock.l_start = position; lock.l_len = sizeof(record); if(fcntl(fd, F_SETLKW, &lock) == -1) { perror(argv[1]); exit(2); } lseek(fd, position, 0); /*read record */ if(read(fd, (char *) &record,sizeof(record)) == 0) { printf("record %d not found\n",recnum); lock.l_type = F_UNLCK; fcntl(fd, F_SETLK, &lock); continue; Linux System Programming

fcntl() 시스템 호출 (9) 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)); lock.l_type = F_UNLCK; /* release record */ fcntl(fd, F_SETLK, &lock); } close(fd); Linux System Programming

lockf() 시스템 호출 (1) lockf() 시스템 호출 단순하면서 직접적인 레코드 록킹 시스템 호출 배타적인 록킹 연산만을 지원 fcntl() 시스템 호출의 F_WRLCK(쓰기 록킹)과 같다 다른 프로세스가 록킹된 영역을 접근하면 록킹이 해제될 때까지 수면상태(sleep)가 된다 현재는 권고형(advisory) 시스템 호출임. Linux System Programming

lockf() 시스템 호출 (2) lockf() 시스템 호출 Linux System Programming

lockf() 시스템 호출 (3) lockf() 시스템 호출 lockf() 시스템 호출의 매개 변수 Linux System Programming

lockf() 시스템 호출 (4) 예제 프로그램 4-7 예제 4-3 프로그램은 lockf() 시스템 호출을 이용하여 구현하여라 #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); } Linux System Programming

lockf() 시스템 호출 (5) 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); lockf(fd,F_UNLCK, sizeof(record)); continue; Linux System Programming

lockf() 시스템 호출 (6) 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)); lockf(fd, F_UNLCK, sizeof(record)); } close(fd); Linux System Programming