@ pipe
pipe(3)
#include <unistd.h>
int pipe(int pipefd[2]);
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(){
int pid;
int fd[2]={0,};
char buffer[255]={0,};
if( pipe(fd) )
{
perror("pipe");
return 0;
}
pid = fork();
if( !pid ){
memcpy( buffer, "hi mom\x0a\x00", 8);
write( fd[1], buffer, strlen(buffer));
return 0;
}else{
read(fd[0], buffer,255);
printf(buffer);
return 0;
}
return 0;
}
- 리턴값 : 성공은 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);
1 #include <sys/types.h>
2 #include <sys/stat.h>
3
4 int main(){
5
6 int res = mkfifo("./test1", S_IRWXU);
7 if( res < 0 )
8 {
9 perror("mkfifo");
10 return 0;
11 }
12
13 return 0;
14 }
- 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);
1 #include <sys/stat.h>
2
3 int main(){
4 mknod( "./test2", S_IFIFO|S_IRWXU, 0);
5 return 0;
6 }
- Named pipe 사용 예제
1 #include <stdio.h>
2 #include <fcntl.h>
3 #include <stdlib.h>
4
5 #define INGOING "ClientToServer.fifo"
6 #define BUFFER 0x100
7
8 int main( int argc, char *argv[]){
9
10 char in[BUFFER];
11
12 mkfifo(INGOING, 0666);
13
14 int in_fd = open(INGOING, O_RDONLY);
15
16 if(in_fd == -1)
17 {
18 perror("open error");
19 return 0;
20 }
21
22 while( read(in_fd, in, BUFFER) > 0 )
23 {
24 printf("server: %s\n", in);
25 }
26
27 return 0;
28 }
[dool2ly@localhost c]$ ./a.out | [root@localhost c]# echo "hihi" >> ClientToServer.fifo
server: hihi
@ 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
-
- 공유 메모리 사용 예제(쓰기)
1 #include <sys/types.h>
2 #include <sys/shm.h>
3 #include <sys/ipc.h>
4 #include <stdio.h>
5 #include <unistd.h>
6
7
8 int main(int argc, char *argv[]){
9
10 int shm_id;
11 int shm_key = 0x1111;
12 void *shared_memory = (void *)0;
13 int loc = 0;
14
15 // Create shared memory
16 shm_id = shmget((key_t)shm_key, sizeof(int), 0666|IPC_CREAT);
17 if(shm_id == -1)
18 {
19 perror("shmget");
20 return 0;
21 }
22
23 // Attach shared memory
24 shared_memory = shmat(shm_id, (void *)0, 0);
25 if( !shared_memory )
26 {
27 perror("shmat");
28 return 0;
29 }
30
31
32
33 while(1)
34 {
35 sleep(1);
36 loc++;
37 *(int *)shared_memory = loc;
38
39 printf("shm_id: %#016x\n", shm_id );
40 printf("loc: %x\n", loc );
41 }
42
43 return 0;
44 }
- 공유 메모리 사용 예제(읽기)
1 #include <sys/types.h>
2 #include <sys/shm.h>
3 #include <sys/ipc.h>
4 #include <stdio.h>
5 #include <unistd.h>
6
7
8 int main( int argc, char *argv[] ){
9
10 int shm_id;
11 int shm_key = 0x1111;
12 int *shared_memory;
13
14 // Create shared memory
15 shm_id = shmget((key_t)shm_key, sizeof(int), 0666);
16 if(shm_id == -1)
17 {
18 perror("shmget");
19 return 0;
20 }
21
22 // Attach shared memory
23 shared_memory = shmat(shm_id, (void *)0, 0);
24 if( !shared_memory )
25 {
26 perror("shmat");
27 return 0;
28 }
29
30
31 while(1)
32 {
33 sleep(1);
34
35 printf("shm_id: %#016x\n", shm_id );
36 printf("shared memory: %x\n", *shared_memory);
37 }
38
39 return 0;
40 }
ref: http://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch08_IPC