linux man page : shmat - °øÀ¯¸Þ¸ð¸® °ü·Ã ¿¬»êÀ» ÇÑ´Ù.
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
Docbook ¿ø¹®

<a href="/modules/moniwiki/wiki.php/manSearch?google=none&name=shmat">shmat</a>(2)

1장. shmat(2)

°øÀ¯¸Þ¸ð¸® °ü·Ã ¿¬»ê


1.1. »ç¿ë¹ý

#include <sys/ipc.h>
#include <sys/shm.h>

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


1.2. ¼³¸í

shmat()´Â °øÀ¯¸Þ¸ð¸® ½Äº°ÀÚÀÎshmid¿¡ °øÀ¯ ¸Þ¸ð¸® ¼¼±×¸ÕÆ®¸¦ ºÙÀ̱â À§Çؼ­ »ç¿ëÇÑ´Ù. ºÙÀÌ´Â ¿µ¿ªÀº shmaddr·Î °áÁ¤ÇÒ ¼ö ÀÖ´Ù.

¸¸¾à shmaddr°¡ NULLÀ̶ó¸é ½Ã½ºÅÛÀº Àû´çÇÑ »ç¿ëÇÏÁö ¾Ê´Â ¸Þ¸ð¸® ¿µ¿ªÀ» ºÙÀÌ°Ô µÈ´Ù.

¸¸¾à shmaddr°¡ NULLÀÌ ¾Æ´Ï°í SHM_RND°¡ shmflg·Î ÁöÁ¤µÇ¾î ÀÖ´Ù¸é shmaddrÀº SHMLBAÀÇ ¹è¼öÀÇ ÁÖ¼Ò·Î ¿¬°áÀÌ ¹ß»ýÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é shmaddrÀº ¿¬°áÇÒ ¼ö ÀÖ´Â Á¤·ÄµÈ ÆäÀÌÁö ÁÖ¼Ò¿©¾ß ÇÑ´Ù.

¸¸ÀÏ SHM_RDONLY°¡ shmflg¿¡ ÁöÁ¤µÇ¾ú´Ù¸é, ¼¼±×¸ÕÆ®´Â ÀбâÀü¿ëÀÌ µÇ¸ç °øÀ¯¸Þ¸ð¸® ¿µ¿ª¿¡ Á¢±ÙÇϰíÀÚ ÇÏ´Â ÇÁ·Î¼¼½º´Â ÀбâÀü¿ëÇã°¡ Á¢±Ù±ÇÀ» °¡Á®¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ»°æ¿ì ¼¼±×¸ÕÆ®´Â Àбâ/¾²±â·Î ºÙ¿©Áö¸ç ÇÁ·Î¼¼½º´Â (¹Ýµå½Ã)Àбâ/¾²±â Çã°¡±ÇÀ» °¡Á®¾ßÇÑ´Ù. ¾²±âÀü¿ë °øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®¸¦ À§ÇÑ Ç÷¡±×´Â ¾ø´Ù.

ÇÁ·Î¼¼½º°¡ Á¾·áµÇ¸é ¿¬°áµÈ ¼¼±×¸ÕÆ®´Â ÀÚµ¿ÀûÀ¸·Î ºÐ¸®µÈ´Ù. µ¿ÀÏÇÑ ¼¼±×¸ÕÆ®´Â Àбâ¿Í Àбâ/¾²±â·Î ÇѹøÀÌ»ó ¿¬°á½Ãų ¼ö ÀÖ´Ù.

shmat°¡ ¼º°øÇÏ¸é ½Ã½ºÅÛÀº shmid_ds±¸Á¶Ã¼ÀÇ ¸â¹öµéÀ» ¾Æ·¡¿Í °°ÀÌ ¾÷µ¥ÀÌÆ® ½ÃŲ´Ù.

  1. shm_atimeÀ» ÇöÀç ½Ã°£À¸·Î ¼öÁ¤ÇÑ´Ù.

  2. shm_lpid¸¦ ÇöÀç È£ÃâÇÑ ÇÁ·Î¼¼½ºÀÇ ID·Î ¼³Á¤ÇÑ´Ù.

  3. shm_nattch´Â 1 Áõ°¡ ½ÃŲ´Ù.

°øÀ¯¸Þ¸ð¸® ¼¼±×¸ÕÆ®°¡ »èÁ¦·Î Ç¥½ÃµÉ ¶§¿¡µµ ¸¶Âù°¡Áö·Î ºÐ¸®µÈ´Ù.

shmdt()´Â °øÀ¯ ¸Þ¸ð¸® ¿µ¿ªÀ¸·Î ºÎÅÍ shmaddr Áּ ºÐ¸® ½Ã۱â À§Çؼ­ »ç¿ëÇÑ´Ù. °øÀ¯¸Þ¸ð¸® ¿µ¿ªÀÇ ºÐ¸®´Â shmat ½Ã½ºÅÛ ÄÝ·Î ¿¬°áµÈ °ª°ú µ¿ÀÏÇÑ shmaddrÀ» °¡Áö°í ÀÖ´Â ¿¬°áµÈ ¿µ¿ªµéÁß Çϳª¿©¾ß ÇÑ´Ù.

shmdt()°¡ ¼º°øÀûÀ¸·Î È£ÃâµÇ¸é shmid_ds±¸Á¶Ã¼ÀÇ ¸â¹ö¸¦ ´ÙÀ½°ú °°ÀÌ º¯°æÇÑ´Ù.

  1. shm_dtimeÀ» ÇöÀç ½Ã°£À¸·Î º¯°æÇÑ´Ù.

  2. shm_lpid¸¦ ÇöÀç È£ÃâÇÑ ÇÁ·Î¼¼½ºÀÇ ID·Î º¯°æÇÑ´Ù.

  3. shm_nattchÀ» 1 °¨¼Ò ½ÃŲ´Ù. ¸¸¾à °ªÀÌ 0ÀÌµÇ°í ¼¼±×¸ÕÆ®¿¡ »èÁ¦Ç¥½Ã°¡ µÇ¾î ÀÖ´Ù¸é ¼¼±×¸ÕÆ®´Â »èÁ¦µÈ´Ù.

È£Ãâ ÇÁ·Î¼¼½ºÀÇ À¯Àú°ø°£¿¡ Á¡À¯µÈ ¿µ¿ªÀº ´ëÀÀÀÌ Ç®¸®Áö ¾Ê´Â´Ù.


1.3. ¹Ýȯ°ª

¼º°øÇϸé attachµÈ shared memory segment¸¦ ¹ÝȯÇÏ°í ½ÇÆÐÇϸé -1À» ¹ÝȯÇÑ´Ù.


1.4. ¿¡·¯

EACCES

È£ÃâÇÑ ÇÁ·Î¼¼½º°¡ ºÙÀ̱⠿øÇÏ´Â ¿µ¿ª¿¡ ´ëÇØ¼­ ±ÇÇÑÀ» °¡Áö°í ÀÖÁö ¾Ê´Ù.

EINVAL

À߸øµÈ shmid °ª, ȤÀº À߸øµÈ shmaddr °ªÀ» °¡Áö°í ÀÖ´Ù.

ENOMEM

¸Þ¸ð¸®ÇÒ´çÀ» ÇÒ ¼ö ¾ø´Ù.


1.5. ¿¹Á¦

#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <string.h> 
#include <unistd.h> 


int main()
{
    int shmid;
    int pid;

    int *cal_num;
    void *shared_memory = (void *)0;


    // °øÀ¯¸Þ¸ð¸® °ø°£À» ¸¸µç´Ù.
		// Å©±â´Â 4byte·Î ÇÑ´Ù.
    shmid = shmget((key_t)1234, sizeof(int), 0666|IPC_CREAT);

    if (shmid == -1)
    {
        perror("shmget failed : ");
        exit(0);
    }

    // ÇÁ·Î¼¼½º ¸Þ¸ð¸®¸¦ °øÀ¯¸Þ¸ð¸®¿µ¿ª¿¡ ºÙÀδÙ. 
    shared_memory = shmat(shmid, (void *)0, 0);
    if (shared_memory == (void *)-1)
    {
        perror("shmat failed : ");
        exit(0);
    }

    cal_num = (int *)shared_memory;
    pid = fork();
    if (pid == 0)
    {
        shmid = shmget((key_t)1234, sizeof(int), 0);
        if (shmid == -1)
        {
            perror("shmget failed : ");
            exit(0);
        }
        shared_memory = shmat(shmid, (void *)0, 0666|IPC_CREAT);
        if (shared_memory == (void *)-1)
        {
            perror("shmat failed : ");
            exit(0);
        }
        cal_num = (int *)shared_memory;
        *cal_num = 1;

        while(1)
        {
            *cal_num = *cal_num + 1;
            printf("child %d\n", *cal_num); 
            sleep(1);
        }
    }

    // ºÎ¸ð ÇÁ·Î¼¼½º·Î °øÀ¯¸Þ¸ð¸®ÀÇ ³»¿ëÀ» º¸¿©ÁØ´Ù. 
    else if(pid > 0)
    {
        while(1)
        {
            sleep(1);
            printf("%d\n", *cal_num);
        }
    }
}
		

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.