카테고리 없음

리눅스 프로세스간 자료 교환(pipe,message queue, shared memory, memory map)

좋은날 2018. 2. 23. 17:49

<자료 출처 : https://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch08_IPC>


pipe

named pipe

message queue

shared memory

memory map

semaphore

socket


<통신 기반 교환>

- pipe(파이프)

#include <unistd.h>


int pipe(int filedes[2]);

- named pipe

#include <sys/stat.h>


int main(int argc, char **argv)

{

  mknod(argv[1], S_IFIFO, 0);

  return 0;

}

- message queue(메시지 큐)

데이터 쓰기

#include <sys/types.h> 

#include <sys/ipc.h> 

#include <sys/msg.h> 

 

int msgsnd (int msqid, (void *)msgp, size_t msgsz, int msgflg) 

ssize_t msgrcv (int msqid, struct  msgbuf  *msgp,  size_t msgsz,  

                long msgtyp, int msgflg) 

데이터 읽기

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>


int msgget(key_t key, int msgflg);


<메모리 공유 기반 교환>

- shared memory(공유 메모리)

공유 메모리를 잡고 쌍방간 데이터교환(32M~1G까지 가능)

#include <sys/types.h>

#include <sys/shm.h>


int shmget(key_t key, int size, int shmflg)

void *shmat( int shmid, const void *shmaddr, int shmflg )

int shmdt( const void *shmaddr)

int shmctl(int shmid, int cmd, struct shmid_ds *buf)

- memory map(메모리맵)

파일을 메모리에 매핑시켜 데이터 교환

메모리 변경 내용이 파일로 곧바로 저장되는 장점이 있음

#include <sys/mman.h>


void *mmap(void *addr, size_t length, int prot, int flags,

       int fd, off_t offset);

- semaphore(세마포어)

데이터 교환 보다는 접근통제 용도로 쓰임

하나의 자원의 여러개의 프로세스가 동시 작업하지 못하게 임계영역을 생성해줌

#include <sys/types.h> 

#include <sys/ipc.h> 

#include <sys/sem.h> 

 

int semget(key_t key, int nsems, int semflg); 

int semop (int semid, struct sembuf *sops, unsigned nsops); 

int semctl(int semid, int semnum, int cmd, union semun arg);

- socket(소켓)

TCP, UDP 등 통신 프로토콜을 이용해서 데이터 교환