앞에서 공부한 예제 소스를 이해하여 스스로 새롭게 프로그램을 짠다.
이 때 cmd로 IPC_RMID를 전달하여 shmid를 clear 시켜준다.
또한 shmat함수의 아규먼트를 지정할 때 참고하자면
첫번째 아규먼트는 shmget을 이용해서 얻어낸 식별자 번호이며,
두번째 아규먼트는 메모리가 붙을 주소를 명시하기 위해 사용하는데, 0을 사용할경우 커널이 메모리가 붙을 주소를 명시하게 된다. 특별한 사항이 없다면 0을 사용하도록 한다.
세번째 아규먼트를 이용해서, 우리는 해당 공유메모리에 대한 "읽기전용", "읽기/쓰기가능" 모드로 열수 있는데, SHM_RDONLY를 지정할경우 읽기 전용으로, 아무값도 지정하지 않을경우 "읽기/쓰기 가능" 모드로 열리게 된다.
ipcs -m |
위 명령을 통해 공유메모 리를 확인할 수 있다. (오른쪽은 삭제 후)
- 첫번째 프로세스에서 변수 값을 shared memory에 쓰고, 두번째 프로세스에서 출력한다.
//shm.c (첫번째 프로세스)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/shm.h>
4 #include <string.h>
5 #include <unistd.h>
6
7 #define KEY_ID 0x12345
8 #define SIZE 10
9
10 int main()
11 {
12 //char buff[10]={'t','e','s','t'};
13 char *temp;
14 //temp=buff;
15 temp="example";
16 printf("temp : %s\n",temp);
17
18
19 int shmid;
20 void *shared_memory = (void *)0;
21
22 /* 공유메모리 공간을 만든다. */
23 shmid = shmget((key_t)KEY_ID, SIZE, 0666|IPC_CREAT);
24 if(shmid<0)
25 {
26 perror("shmget failed : ");
27 exit(0);
28 }
29 //printf("shmid is = %d, pid=%d\n", shmid, getpid());
30
31 /* 공유메모리를 사용하기 위해 프로세스메모리에 붙인다. */
32 shared_memory = shmat(shmid, (void *)0, 0);
33 if(shared_memory==(void *)-1)
34 {
35 perror("shmat failed : ");
36 exit(0);
37 }
38
39 memcpy((char *)shared_memory, temp, SIZE);
40 //strcpy((char *)shared_memory, temp);
41
42 shmdt(shared_memory);
43
44
45 return 0;
46 }
//shm_client.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/shm.h>
4 #include <string.h>
5 #include <unistd.h>
6
7 #define KEY_ID 0x12345
8 #define SIZE 10
9
10 int main()
11 {
12 int shmid;
13 void *shared_memory = (void *)0;
14
15 /* 공유메모리 공간을 만든다. */
16 shmid = shmget((key_t)KEY_ID, SIZE, 0666|IPC_CREAT);
17 if(shmid <0 )
18 {
19 perror("shmget failed : ");
20 exit(0);
21 }
22 //printf("shmid is = %d, pid=%d\n", shmid, getpid());
23
24
25 /* 공유메모리를 사용하기 위해 프로세스메모리에 붙인다. */
26 shared_memory = shmat(shmid, (void *)0, 0);
27 if(shared_memory == (void *)-1)
28 {
29 perror("shmat failed : ");
30 exit(0);
31 }
32
33 char *ret;
34 ret=(char *)shared_memory;
35 printf("ret : %s\n",ret);
36
37 printf("read data : %s\n", (char *)shared_memory);
38 shmdt(shared_memory);
39
40 /*clear*/
41 int tempid=shmget(KEY_ID, SIZE,0);
42 shmctl(tempid, IPC_RMID, NULL);
43
44 return 0;
45 }
2. 첫번째 프로세스에서 실행 시 입력받은 데이터를 shared memory에 쓰고, 두번째 프로세스에서 그 값을 읽고 출력한다.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/shm.h>
4 #include <string.h>
5 #include <unistd.h>
6
7 #define KEY_ID 0x12345
8 #define SIZE 10
9
10 int main()
11 {
12 char buff[SIZE];
13 char *temp;
14 int shmid;
15 void *shared_memory = (void *)0;
16
17 /*input data*/
18 scanf("%s",buff);
19 temp=buff;
20 printf("temp : %s\n",temp);
21
22 /* 공유메모리 공간을 만든다. */
23 shmid = shmget((key_t)KEY_ID, SIZE, 0666|IPC_CREAT);
24 if(shmid<0)
25 {
26 perror("shmget failed : ");
27 exit(0);
28 }
29 //printf("shmid is = %d, pid=%d\n", shmid, getpid());
30
31 /* 공유메모리를 사용하기 위해 프로세스메모리에 붙인다. */
32 shared_memory = shmat(shmid, (void *)0, 0);
33 if(shared_memory==(void *)-1)
34 {
35 perror("shmat failed : ");
36 exit(0);
37 }
38
39 memcpy((char *)shared_memory, temp, SIZE);
40 //strcpy((char *)shared_memory, temp);
41
42 shmdt(shared_memory);
43
44
45 return 0;
46 }
3. 첫번째 프로세스에서 실행 시 원하는 데이터를 shared memory에 쓰고, 두번째 프로세스에서 선택적으로 그 값을 출력한다.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/shm.h>
4 #include <string.h>
5 #include <unistd.h>
6
7 #define KEY_ID 0x12345
8 #define SIZE 1024
9
10 int main()
11 {
12 int shmid;
13 void *shared_memory = (void *)0;
14
15 /* 공유메모리 공간을 만든다. */
16 shmid = shmget((key_t)KEY_ID, SIZE, 0666|IPC_CREAT);
17 if(shmid <0 )
18 {
19 perror("shmget failed : ");
20 exit(0);
21 }
22 //printf("shmid is = %d, pid=%d\n", shmid, getpid());
23
24
25 /* 공유메모리를 사용하기 위해 프로세스메모리에 붙인다. */
26 shared_memory = shmat(shmid, (void *)0, 0);
27 if(shared_memory == (void *)-1)
28 {
29 perror("shmat failed : ");
30 exit(0);
31 }
32
33 char *ret;
34 ret=(char *)shared_memory;
35 printf("ret : %s\n",ret);
36 printf("read data : %s\n", (char *)shared_memory);
37
38 printf("address : %p\n",&shared_memory);
39 printf("shared_memory+8 : %s\n", (char *)shared_memory+8);
40
41
42 shmdt(shared_memory);
43
44 /*clear*/
45 int tempid=shmget(KEY_ID, SIZE,0);
46 shmctl(tempid, IPC_RMID, NULL);
47
48 return 0;
49 }
'Etc' 카테고리의 다른 글
Database 용어 정리 (0) | 2021.11.17 |
---|---|
[IPC]Shared Memory (0) | 2021.10.22 |
[IPC]Semaphore (0) | 2021.10.22 |
[IPC]Semaphore C 예제 (0) | 2021.10.22 |
[IPC]Semaphore 함수 (0) | 2021.10.22 |