728x90
반응형

CS(Computer Science)/UNIX 11

[UNIX] read() write() 시스템 콜의 사용법과 주의사항

UNIX file 접근의 기초 read/write 시스템 콜에 대해 설명하기 전에 먼저 UNIX file 접근의 기초에 대해서 이해해 보자. UNIX상의 모든 file은 byte들의 linear sequence이다. 이 말은 즉, Text file과 Binary file이 따로 나누어져 있지 않다는 의미이다. 모든 파일은 Binary file이다. UNIX에서는 이런 파일들을 프로세스상에서 구분하기 위해서 open 해놓은 파일에 대해서 file descriptor라는 파일 구분자를 운영한다. 이는 file을 open 할 때마다 구조체 배열에 파일의 메타데이터가 저장되는 식으로 작동된다. 참고로 open 시스템 콜을 사용해서 file을 open 하게 되면 가공되지 않은 binary code를 그대로 받게 ..

UNIX - [Record Locking]

사용법 #include int fcntl(int filedes, int cmd, struct flock *ldata); /* > filedes : lock을 설정 하려는 file의 descriptor > read-lock은 O_RDONLY/O_RDWR로 open된 file에 한해서 적용 가능 > write-lock은 O_WRONLY/O_RDWR로 open된 file에 한해서 적용 가능 > cmd : > F_GETLK : lock 정보 얻기 > 해당 정보는 세 번째 인수에 저장 > F_SETLK : non-blocking locking or unlocking > lock 설정에 관한 자세한 정보는 세 번째 인수에 지정 > F_SETLKW : blocking locking > lock 설정에 관한 자세한 정..

UNIX - [Shared memory]

shared memory (공유 메모리) 둘 이상의 프로세스가 물리적 메모리의 일부를 공유 가장 효율적인 IPC기법이다. shmget 시스템 호출 #include #include #include int shmget(key_t key, size_t size, int permflag); /* > key : 공유 메모리 영역의 identifier > size : 공유 메모리 영역의 최소 크기 > permflag : access permission|IPC_CREAT|IPC_EXCL > return 값 : 공유 메모리 영역의 identifier */ 공유 메모리 생성 예 512byte의 문자를 저장 할 공유 메모리 생성 shmid1 = shmget(0111, 512, 0600|IPC_CREAT); 10개의 정수를..

UNIX - [Semaphore]

semaphore 세마포는 양의 정수로 선언할 수 있다. 세마포의 2가지 기능 semWait(); → 세마포-1을 하고 세마포 ≥ 0 이라면 지나가고 아니라면 세마포 ≥ 0 이 될 때까지 Block한다. semSig(); → 세마포+1을 한다. p(sem); // semWait something interesting; // 크리티컬섹션 v(sem); // semSig semget 시스템 호출 사용법 #include #include #include int semget(key_t key, int nsems, int permflags); /* > key : semaphore 집합 이름 > nsems : semaphore 집합 내의 semaphore 수 > permflags : 0600, IPC_CREAT, I..

UNIX - [시스템 V의 프로세스간 통신 - Message queue]

시스템 V의 프로세스간 통신 유닉스는 처음 개발된 이래 다양한 형태로 발전했다. 크게 BSD 계열과 시스템 V 계열로 구분할 수 있다. 시스템V계열 유닉스에서 개발해 제공하는 프로세스간 통신 방법이 메세지 큐, 공유 메모리, 세마포어 이다. 이 세가지를 묶어서 시스템V IPC 라고 한다. 이것은 SVR2에서 처음 개발되었고, SVR4에서도 제공하고 있으며 현재는 대부분의 유닉스 시스템에서 제공하고 있다. IPC 설비 IPC(Inter-Process Communication)란 프로세스 간 통신을 의미한다. UNIX의 대표적인 IPC는 message_queue, semaphore, shared memory segment가 있다. key • key는 message_queue, semaphore, shared..

UNIX - [PIPE - 2]

FIFO pipe는 동일 ancestor를 갖는 프로세스들만 연결 가능. fifo는 모든 프로세스들을 연결 가능. UNIX의 file 이름을 부여 받는다. 소유자, 크기, 연관된 접근 허가를 가진다. 일반 file처럼, open, close, read, write, remove가 가능하다. fifo는 pipe와 다르게 UNIX의 파일 이름을 부여 받는다. 따라서 파일처럼 여러 권한 설정과 파일 크기를 가지고, open, close, read, write, remove 등의 시스템 콜을 사용 가능하다. 사용법 fifo 만들기 #include #include int mkfifo(const char *pathname, mode_t mode); // mode는 보통 0666으로 그냥 줌 → fifo open (..

UNIX - [PIPE]

유닉스의 프로세스 간 통신 방법 즉 IPC 통신에는 PIPE가 있다. PIPE란 이름처럼 두 프로세스 간에 데이터가 오고 가는 관. 즉 영어로 파이프를 생성해서 두 프로세스가 데이터를 주고받는 방법이다. 이 파이프는 fifo의 성질을 띄고있으며 단방향 통신이라는 특징이 있다. 파이프는 read와 write 시스템 콜을 이용해서 데이터를 주고받으며, 기본적으로 blocking read/ blocking write를 사용한다. 파이프를 이용해서 프로세스간 동기화 작업을 수행할 수 있으며, 프로세스 간 서버와 클라이언트의 동작을 구현할 수 있다. pipe 만들기 #include int pipe(int filedes[2]); → filedes[0] : 읽기용 → filedes[1] : 쓰기용 → 성공시 0, 실..

UNIX - [MEMORY MAPPING]

메모리 매핑이란 메모리의 특정 부분을 프로세스에 매핑하는 것을 의미한다. 이는 mmap() 함수를 통해 수행할 수 있으며, 같은 메모리 공간을 여러 프로세스가 동시에 매핑할 수 있다. 하지만 매핑한 주소의 값을 직접 변경 하는 것이 아니라, 매핑된 주소 위치의 레퍼런스를 수정하면 매핑된 주소의 값이 바뀌는 식으로 한 번 거쳐서 변경된다. 다음은 메뉴얼 페이지의 글이다. mmap()은 호출 프로세스의 가상 주소 공간에 새 매핑을 만듭니다. 새 매핑의 시작 주소는 addr에 지정됩니다. length 인수는 매핑의 길이(0보다 커야 함)를 지정합니다. Signal은 동기화의 수단으로는 사용가능하다. but 데이터를 주고받는 수단으로는 사용 불가능하다. 메모리 매핑을 이용해서 데이터를 건들면 파일의 내용 자체가..

UNIX - [SIGNAL]

signal이란? → 소프트웨어 인터럽트 (하드웨어가 아니라 소프트웨어적으로 interrupt를 발생시키는 방법) 인터럽트(interrupt)를 발생시키는 기능을 하는 시그널은 시스템에서 아주 중요하게 사용된다. 예를 들면 터미널에서는 흔히 Control + C 을 사용해서 실행 중인 프로세스를 종료시킨다. 이는 SIGINT(interrupt signal)라는 미리 정의된 시그널을 프로세스에게 보내서 강제 종료 시키는 방법이다. 우리는 이렇게 알게 모르게 시그널을 사용 중이다. 인터럽트(Interrupt)란? 인터럽트란 CPU가 하던 일을 멈추게하고(혹은 아무 것도 안하고 있는 상태를 멈추고) 끼어드는 것으로 CPU에 할당된 작업을 변경하는데 사용할 수 있다. 일반적으로 CPU는 Fetch stage -..

UNIX - [소켓 프로그래밍 예제 - 2]

👉 이 절에서는 소켓을 이용한 간단한 예제 프로그램을 작성해본다. 소켓에는 같은 시스템에 있는 프로세스끼리 데이터를 주고받을 때 사용하는 유닉스 도메인 소켓과 다른 시스템의 프로세스와 통신을 하는 인터넷 소켓이 있다. 이 절에서는 예제를 통해 각각의 사용 방법을 알아보자. 유닉스 도메인 소켓 예제 유닉스 도메인 소켓(unix domain socket)은 같은 시스템에서 통신이 일어나므로 TCP/IP 프로토콜을 직접 이용할 필요가 없다. 따라서 유닉스 도메인 소켓에서 사용하는 소켓 주소 구조체의 항목도 IP 주소가 아닌 경로명을 지정하도록 되어 있다. 이는 파이프나 시스템 V IPC에서 특수 파일을 통신에 사용하는 것과 같다고 생각하면 된다. 소켓 주소 구조체의 항목이 다른 것을 제외하면 유닉스 도메인 소..

728x90
반응형