리눅스 프로세스간 자료 교환(pipe,message queue, shared memory, memory map)
<자료 출처 : 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 등 통신 프로토콜을 이용해서 데이터 교환