둘둘리둘둘리둘둘리둘둘리둘둘리둘

IPC(Inter Process Communication) 본문

Linux/Programming

IPC(Inter Process Communication)

dool2ly 2016. 7. 9. 23:05

@ pipe


pipe(3)


       #include <unistd.h>


       int pipe(int pipefd[2]);



 - 리턴값 : 성공은 0 에러는 -1, 실패시 errno 설정됨

 - pipefd 배열의 인덱스 0은 읽기, 1은 쓰기

 - 간단하게 쓸 수 있지만 반이중 통신임-> 읽기, 쓰기 전용으로 프로세스를 만들기에 좋다




@ FIFO(First In First Out;named pipes)


 - 쉘 명령어 mkfifo(1)로 직접 생성 가능


mkfifo(3)


       #include <sys/types.h>

       #include <sys/stat.h>


       int mkfifo(const char *pathname, mode_t mode);



 - mod_t(http://dool2ly.tistory.com/94)

 - mode_t는 FIFO의 권한이며, 일반적으로 프로세스의 umask에 의해 수정된다: 생성되는 파일의 권한은 (mod & ~umask).


 시스템 콜 함수 mknod(2)를 이용해서도 생성 가능


mknod(2) 


       #include <sys/types.h>

       #include <sys/stat.h>

       #include <fcntl.h>

       #include <unistd.h>


       int mknod(const char *pathname, mode_t mode, dev_t dev);



 - Named pipe 사용 예제




@ Message Queue


msgget(2); 메세지 큐 생성


       #include <sys/types.h>

       #include <sys/ipc.h>

       #include <sys/msg.h>


       int msgget(key_t key, int msgflg);


- key: 생성되는 큐의 식별자

- msgflg: IPC_CREAT(같은 key의 큐가 있으면 식별자 반환, 없으면 생성)

  IPC_EXCL(같은 key의 큐가 없으면 생성, 있으면 -1)


msgsnd(2), msgrcv(2); 메세지 큐 데이터 읽기,쓰기


       #include <sys/types.h>

       #include <sys/ipc.h>

       #include <sys/msg.h>


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


       ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);


 - msqid: msgget(2)에서 생성된 key 
 - msgp: caller-defined 구조체 포인터이며, 일반적으로 아래와같은 form을 가진다.

           struct msgbuf {
               long mtype;       /* 반드시 양의 정수여야하며, 받는 프로세서가 메세지를 선택할 수 있게한다. */
               char mtext[1];    /* message data */
           };

 - msgsz: mtext 크기
 - msgflg: IPC_NOWAIT면 non-block모드로 작동(메세지 없으면 ENOMSG 반환)




@ Shared Memory


 - 공유 메모리는 커널이 관리하므로 생성을 요청해야한다


shmget(2), shmat(2), shmdt(2), shmctl(2)


       #include <sys/types.h>

       #include <sys/ipc.h>

       #include <sys/shm.h>


       int shmget(key_t key, size_t size, int shmflg);                     // 인자 key와 연관된 공유 메모리 생성 요청


       void *shmat(int shmid, const void *shmaddr, int shmflg);    // shmid로 식별된 공유 메모리를 attach


       int shmdt(const void *shmaddr);                                    // 지정된 주소(shmaddr)의 공유 메모리를 detach


       int shmctl(int shmid, int cmd, struct shmid_ds *buf);        // shmid로 식별된 공유 메모리를 cmd로 제어 명령

 - shmflg: IPC_CREAT, IPC_EXCL
 - 


 - 공유 메모리 사용 예제(쓰기)

 - 공유 메모리 사용 예제(읽기)


ref: http://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch08_IPC



'Linux > Programming' 카테고리의 다른 글

파일 접근 권한(mode_t)  (0) 2017.01.08
Thread  (0) 2016.07.08
Signal  (0) 2016.07.05
유저 정보 획득  (0) 2016.07.03
파일 속성 획득  (0) 2016.07.03
Comments