mmap(2)
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : docbook>mmap(2)



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

#!title
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
<chapter lang=ko>
<!-- ÀÛ¼ºÀÚ : yundream             -->
<!-- ÀÛ¼ºÀÏ : 2004/02/25           -->
<!-- ¿¬¶ôó : yundream@joinc.co.kr -->

<!-- ÇÔ¼ö À̸§À» ÀÔ·ÂÇÕ´Ï´Ù -->
<title>mmap(2)</title>

<!-- ÀÌ°Ç ÇÔ¼ö¿¡ ´ëÇÑ ´ë·«ÀûÀÎ ¼³¸íÀ̱¸¿ä -->
<para>
	ÆÄÀÏÀ̳ª ÀåÄ¡¸¦ ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃŰ°Å³ª Ǭ´Ù.
</para>
 
<!-- ¿©±â¿¡ ÇÔ¼öÀÇ °£´ÜÇÑ »ç¿ë¹ýÀÌ µé¾î°©´Ï´Ù -->
<section>
	<title>»ç¿ë¹ý</title>
	<para>
		<screen>
#include &lt;unistd.h&gt;
#include &lt;sys/mman.h&gt;

#ifdef _POSIX_MAPPED_FILES
void * mmap(void *start, size_t length, int prot, int
        flags, int fd, off_t offset);
int munmap(void *start, size_t length);

#endif
		</screen>
	</para>
</section>

<!-- ¿©±â¿£ ÇÔ¼öÀÇ ÀÚ¼¼ÇÑ ¼³¸í ÀÌ µé¾î°©´Ï´Ù -->
<section>
	<title>¼³¸í</title>
	<para>
		mmap() ÇÔ¼ö´Â <emphasis>fd</emphasis>·Î ÁöÁ¤µÈ ÆÄÀÏ(ȤÀº ´Ù¸¥ °´Ã¼)¿¡¼­
		<emphasis>offset</emphasis>À» ½ÃÀÛÀ¸·Î <emphasis>length</emphasis>¹ÙÀÌÆ®
		¸¸Å­À» <emphasis>start</emphasis>ÁÖ¼Ò·Î ´ëÀÀ½Ã۵µ·Ï ÇÑ´Ù. startÁÖ¼Ò´Â 
		´ÜÁö ±× ÁÖ¼Ò¸¦ »ç¿ëÇßÀ¸¸é ÁÁ°Ú´Ù´Â Á¤µµ·Î º¸Åë 0À» ÁöÁ¤ÇÑ´Ù. mmap´Â
 		ÁöÁ¤µÈ ¿µ¿ªÀÌ ´ëÀÀµÈ ½ÇÁ¦ ½ÃÀÛÀ§Ä¡¸¦ ¹ÝȯÇÑ´Ù. 
		<emphasis>prot</emphasis>ÀÎÀÚ´Â ¿øÇÏ´Â ¸Þ¸ð¸® º¸È£¸ðµå¸¦ ¼³Á¤ÇÑ´Ù. 
		»ç¿ëÇÒ ¼ö ÀÖ´Â ºñÆ®´Â ´ÙÀ½°ú °°´Ù. 
		<variablelist>	
			<varlistentry>
			<term>PROT_EXEC</term>	
			<listitem>
				<para>
					ÆäÀÌÁö´Â ½ÇÇà°¡´ÉÇÏ´Ù.
				</para>	
			</listitem>
			</varlistentry>

			<varlistentry>
			<term>PROT_READ</term>	
			<listitem>
				<para>
					ÆäÀÌÁö´Â ÀÐÀ» ¼ö ÀÖ´Ù. 
				</para>	
			</listitem>
			</varlistentry>

			<varlistentry>
			<term>PROT_WRITE</term>
			<listitem>
				<para>
					ÆäÀÌÁö´Â ¾²¿©Áú ¼ö ÀÖ´Ù. 
				</para>	
			</listitem>
			</varlistentry>

			<varlistentry>
			<term>PROT_NONE</term>
			<listitem>
				<para>
					ÆäÀÌÁö´Â Á¢±ÙÇÒ ¼ö ¾ø´Ù. 
				</para>	
			</listitem>
			</varlistentry>
		</variablelist>	
		<emphasis>flags</emphasis>´Â ´ëÀÀµÈ °´Ã¼ÀÇ Å¸ÀÔ, ´ëÀÀ ¿É¼Ç, ´ëÀÀµÈ 
		ÆäÀÌÁö º¹»çº»¿¡ ´ëÇÑ ¼öÁ¤ÀÌ ±× ÇÁ·Î¼¼½º¿¡¼­¸¸ º¸ÀÏ °ÍÀÎÁö ¾Æ´Ï¸é, 
		´Ù¸¥ ÂüÁ¶ÇÏ´Â ÇÁ·Î¼¼½º¿Í °øÀ¯ÇÒ °ÍÀÎÁö¸¦ ¼³Á¤ÇÑ´Ù. ´ÙÀ½°ú °°Àº ºñÆ®µéÀ»
		»ç¿ëÇÒ ¼ö ÀÖ´Ù. 
		<variablelist>	
			<varlistentry>
			<term>MAP_FIXED</term>	
			<listitem>
				<para>
					ÁöÁ¤µÈ ÁÖ¼Ò ÀÌ¿ÜÀÇ ´Ù¸¥ ÁÖ¼Ò¸¦ ¼±ÅÃÇÏÁö ¾Ê´Â´Ù.
					ÁöÁ¤µÈ ÁÖ¼Ò°¡ »ç¿ëµÉ ¼ö ¾ø´Ù¸é mmap()´Â ½ÇÆÐÇÑ´Ù. 
					¸¸ÀÏ MAP_FIXED°¡ ÁöÁ¤µÇ¸é, <emphasis>start</emphasis>´Â
					ÆäÀÌÁö Å©±âÀÇ ¹è¼öÀ̾î¾ß ÇÑ´Ù. ÀÌ ¿É¼ÇÀº »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ
					ÁÁ´Ù.
				</para>	
			</listitem>
			</varlistentry>
			<varlistentry>
			<term>MAP_FIXED</term>	
			<listitem>
				<para>
					ÁöÁ¤µÈ ÁÖ¼Ò ÀÌ¿ÜÀÇ ´Ù¸¥ ÁÖ¼Ò¸¦ ¼±ÅÃÇÏÁö ¾Ê´Â´Ù.
					ÁöÁ¤µÈ ÁÖ¼Ò°¡ »ç¿ëµÉ ¼ö ¾ø´Ù¸é mmap()´Â ½ÇÆÐÇÑ´Ù. 
					¸¸ÀÏ MAP_FIXED°¡ ÁöÁ¤µÇ¸é, <emphasis>start</emphasis>´Â
					ÆäÀÌÁö Å©±âÀÇ ¹è¼öÀ̾î¾ß ÇÑ´Ù. ÀÌ ¿É¼ÇÀº »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ
					ÁÁ´Ù.
				</para>	
			</listitem>
			</varlistentry>

			<varlistentry>
			<term>MAP_SHARED</term>	
			<listitem>
				<para>
					´ëÀÀµÈ °´Ã¼¸¦ ´Ù¸¥ ¸ðµç ÇÁ·Î¼¼½º¿Í °øÀ¯ÇÑ´Ù.
				</para>	
			</listitem>
			</varlistentry>

			<varlistentry>
			<term>MAP_PRIVATE</term>	
			<listitem>
				<para>
					°³º°ÀûÀÎ copy-on-write ´ëÀÀÀ» ¸¸µç´Ù.(´Ù¸¥ ÇÁ·Î¼¼½º¿Í 
					´ëÀÀ ¿µ¿ªÀ» °øÀ¯ÇÏÁö ¾Ê´Â´Ù).
				</para>	
			</listitem>
			</varlistentry>
		</variablelist>	
		À§ÀÇ 3°³ÀÇ Ç÷¡±×´Â POSIX.1b¿¡ ±ÔÁ¤µÇ¾î ÀÖ´Ù. ¸®´ª½º´Â MAP_DENYWRITE,
		MAP_EXECUTABLE, MAP_ANON(YMOUS)µµ Áö¿øÇÑ´Ù. 
	</para>
	<para>
		munmap() ´Â ÁöÁ¤µÈ ÁÖ¼Ò °ø°£¿¡ ´ëÇÑ ´ëÀÀÀ» Ǭ´Ù. ¹üÀ§³»ÀÇ ÁÖ¼Ò¿¡ ´ëÇÑ
		ÂüÁ¶ °è¼ö¸¦ ´Ã·Á¼­ À¯È¿ÇÏÁö ¾ÊÀº ¸Þ¸ð¸® ÂüÁ¶·Î ¸¸µç´Ù. 
	</para>
</section>

<!-- ÇÔ¼ö°¡ µÇµ¹·ÁÁÖ´Â °ªÀ̱¸¿ä -->
<section>
	<title>¹Ýȯ°ª</title>
	<para>
		¼º°ø½Ã, mmap()´Â ³»ÀÀµÈ ¿µ¿ªÀÇ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù. 
		¿¡·¯½Ã¿¡´Â -1(MAP_FAILED)ÀÌ ¸®ÅϵǸç, errno´Â Àû´çÇÑ °ªÀ¸·Î 
		¼³Á¤µÈ´Ù. munmap()´Â 0À» ¸®ÅÏÇϸç, ½ÇÆÐ½Ã -1ÀÌ ¸®ÅϵǸç, errno°¡ 
		¼³Á¤µÈ´Ù. 
	</para>
</section>

<!-- ¿¡·¯°¡ ¹ß»ýÇßÀ»¶§ µÇµ¹·ÁÁÖ´Â °ªµéÀÔ´Ï´Ù -->
<section>
	<title>¿¡·¯</title>
	<para>
		<variablelist>	
			<varlistentry>
			<term>EBADF</term>	
			<listitem>
				<para>	
					<emphasis>fd</emphasis>°¡ À¯È¿ÇÑ ÆÄÀÏ ±â¼úÀÚ°¡ ¾Æ´Ï´Ù.
				</para>	
			</listitem>
			</varlistentry>
			<varlistentry>
			<term>EACCES</term>	
			<listitem>
				<para>	
					MAP_PRIVATE°¡ ¼³Á¤µÇ¾î ÀÖÁö¸¸ fd°¡ ÀÐÀ» ¼ö ÀÖµµ·Ï ¿­·Á
					ÀÖÁö ¾Ê´Ù. ¶Ç´Â MAP_SHARED¿Í RPOT_WRITE°¡ ¼³Á¤µÇ¾î ÀÖÁö¸¸
					fd°¡ ¾µ ¼ö ÀÖµµ·Ï ¿­·ÁÀÖÁö ¾Ê´Ù. 
				</para>	
			</listitem>
			</varlistentry>
			<varlistentry>
			<term>EINVAL</term>	
			<listitem>
				<para>	
					start³ª length³ª offsetÀÌ Àû´çÇÏÁö ¾Ê´Ù. º¸Åë ³Ê¹« Å©°Å³ª
					PAGESIZE °æ°è·Î Á¤·ÄµÇ¾î ÀÖÁö ¾ÊÀ» °æ¿ì.
				</para>	
			</listitem>
			</varlistentry>
			<varlistentry>
			<term>ETXTBUSY</term>	
			<listitem>
				<para>	
					MAP_DENYWRITE°¡ ¼³Á¤µÇ¾î ÀÖÀ¸³ª fd·Î ÁöÁ¤µÈ °´Ã¼°¡ 
					¾²±â À§ÇØ ¿­·ÁÀÖ´Ù.
				</para>	
			</listitem>
			</varlistentry>
			<varlistentry>
			<term>EAGAIN</term>	
			<listitem>
				<para>	
					ÆÄÀÏÀÌ Àá°Ü ÀÖ´Ù.
				</para>	
			</listitem>
			</varlistentry>
			<varlistentry>
			<term>ENOMEM</term>	
			<listitem>
				<para>	
					»ç¿ëÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸®°¡ ¾ø´Ù.
				</para>	
			</listitem>
			</varlistentry>
		</variablelist>	
	</para>
</section>

<!-- ¸¶Áö¸·À¸·Î ¿¡Á¦ ÀÔ´Ï´Ù                                                 -->
<!-- ¿©±â¿¡´Â ¿ÏÀüÇÑ ¿¹Á¦°¡ µé¾î°¡ Àִµ¥, ±»ÀÌ ¿ÏÀüÇÑ ¿¹Á¦¸¦ ¸¸µéÇÊ¿ä ¾øÀÌ -->
<!-- ÄÚµå ÀϺκи¸ ÀÛ¼ºÇؼ­ ¿Ã·ÁÁּŵµ µË´Ï´Ù                               --> 
<!-- "<", ">", "&" µîÀº º¯È¯ÇØ ÁÖ¼Å¾ß Çϴµ¥, ±ÍÂúÀ¸½Ã¸é :-) º¯È¯ ÇÏÁö ¾Ê   -->
<!-- ¾Æµµ µË´Ï´Ù. Á¦°¡ °Ë»ç ÇØ¼­ ¿Ã¸®°Ú½À´Ï´Ù                               -->
<!-- ¿¹Á¦¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸íÀ» Àû¾îÁּŵµ µÇ±¸¿ä                            -->
<section>
	<title>¿¹Á¦</title>
	<para>
		<screen>
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;errno.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/stat.h&gt;
#include &lt;sys/mman.h&gt;
#include &lt;unistd.h&gt;
#include &lt;fcntl.h&gt;

int main(int argc, char **argv)
{
    int fd;
    char *file = NULL;
    struct stat sb;
    char buf[80] ={0x00,};
    int flag = PROT_WRITE | PROT_READ;

    if (argc &lt; 2)
    {
        fprintf(stderr, "Usage: input\n");
        exit(1);
    }

    if ((fd = open(argv[1], O_RDWR|O_CREAT)) &lt; 0)
    {
        perror("File Open Error");
        exit(1);
    }

    if (fstat(fd, &amp;sb) &lt; 0)
    {
        perror("fstat error");
        exit(1);
    }

    file = (char *)malloc(40);

    // mmap¸¦ ÀÌ¿ëÇØ¼­ ¿­¸° ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ´ëÀÀ½ÃŲ´Ù.
    // fileÀº ´ëÀÀµÈ ÁÖ¼Ò¸¦ °¡¸®Å°°í, fileÀ» ÀÌ¿ëÇØ¼­ ÇÊ¿äÇÑ ÀÛ¾÷À»
    // ÇÏ¸é µÈ´Ù.
    if ((file =
        (char *) mmap(0, 40, flag, MAP_SHARED, fd, 0)) == -1)
    {
        perror("mmap error");
        exit(1);
    }
    printf("%s\n", file);
    memset(file, 0x00, 40);
    munmap(file);
    close(fd);
}
		</screen>
	</para>
</section>
<section>
	<title>Âü°í¹®Çå</title>
	<para>
		<orderedlist>
		<listitem>
			<para>
			<ulink url="http://www.joinc.co.kr/modules/moniwiki/wiki.php/mmap">mmap</ulink>
			</para>
		</listitem>
		</orderedlist>
	</para>
</section>
</chapter>

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