mmap과 msync에 대한 질문입니다.

upersbird의 이미지

+---------------------------------------------------------------------------------+
fd = open( "mmap_test", ... );
addr = mmap( (void *)0,
1024,
PROT_WRITE|PROT_READ,
MAP_SHARED,
0 );
memcpy(addr, "hello world", 11);
...
+---------------------------------------------------------------------------------+
# ./mmap_test_code (프로그램 실행)

MMAP I/O ADDR : c031b000
Bus error (core dumped)
+---------------------------------------------------------------------------------+
질문 1) 파일의 내용이 0이면 맵핑한 공간이 0이라서 메모리 접근 시
에러가 나는 것인가요?
(mmap 전 ftruncate를 하게되면 위 코드는 잘 수행이 됩니다.)

질문 2) msync와 munmap을 사용하지 않더라도 프로그램 종료 시 파일에는
hello world 라는 string이 기록되어 있습니다.
이는 MAP_SHARED로 설정되어 있다면 프로세스 종료 시 자동으로
memory -> file 로 sync가 되어서 인가요?

질문 3) 만약, (질문 2)의 상황에서 프로세스가 종료되지 않은 시점에서
memcpy()가 이루어지고 파일의 내용을 확인하게되면,
이 역시, hello wolrd라는 string이 기록되어 있습니다.
MAP_SHARED에서 msync와 munmap이 필요하다는 것을 확인할만한 예제 혹은 이론을
알려주실 수 있을까요?

자세하지않더라도 대략적인, 이해가능한 설명을 부탁드립니다..

upersbird의 이미지

while(1)
{
        data = cnt + '0';
        for(i = 0; i < MAPP_SIZE; i++)
        {
                memcpy(addr+i, &data, 1);
        }
 
        //CASE 1
        //msync(addr, MAPP_SIZE, MS_SYNC);
        //CASE 2
        msync(addr, MAPP_SIZE, MS_SYNC);
 
        printf("fill %d in File\n", cnt);
        sleep(3);
 
        cnt++;
        if(cnt == 10) break;
}

msync가 없을 때, 파일의 내용을 보면 아무것도 기록되지 않는 것으로 확인
프로그램이 마치고 나서야 99999....로 파일에 기록되어 있음
msync가 있을 때, 파일의 내용이 채워지는 것을 확인
프로그램 동작 중에 파일을 확인하면 0000... 1111.... 2222.... 으로 동기화되어 있음을 확인

upersbird의 이미지

테스트를 잘못해서 나온 질문 같습니다.
msync, munmap 전에 sleep()을 주고 테스트를 진행하니 파일의 내용이 없다가
sleep()이 끝난 후 파일에 기록됨을 확인하였습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.