<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: mmap: Два файла в один массив</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/7386.html</link>
    <description>собственно что хочется?&lt;br&gt;хочется промапить два файла в один маассив. например файл А идёт и оффсета 0 до рамера SIZE1-1, а файл Б от оффеста SIZE1 до SIZE1+SIZE2-1.&lt;br&gt;как бы ничего продебы сложного но вот такой код сегфолтится сразу послее финального return-a рандомально. т.е. при разных значениях SIZE1 и SIZE2 иногда проходит нормально,а иногда сегфолтится.&lt;br&gt;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br&gt;#include &amp;lt;errno.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/stat.h&amp;gt;&lt;br&gt;#include &amp;lt;fcntl.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/mman.h&amp;gt;&lt;br&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br&gt;#include &amp;lt;string.h&amp;gt;&lt;br&gt;&lt;br&gt;#define MAIN_SIZE 40960&lt;br&gt;&lt;br&gt;#define SWAP_SIZE MAIN_SIZE*2&lt;br&gt;&lt;br&gt;int create_file(char *fname,off_t size)&#123;&lt;br&gt;    int fd;&lt;br&gt;    if((fd=open(fname,O_CREAT&amp;#124;O_RDWR,S_IRWXU))&amp;lt;0)&#123; &lt;br&gt;perror(&quot;open(2)&quot;);&lt;br&gt;return -1;&lt;br&gt;    &#125;&lt;br&gt;&lt;br&gt;    if(lseek(fd,size-1,SEEK_SET)==(off_t)-1)&#123;&lt;br&gt;perror(&quot;lseek(2)&quot;);&lt;br&gt;close(fd);&lt;br&gt;return -1;&lt;br&gt;    &#125;&lt;br&gt;    &lt;br&gt;    if(write(fd,(void*)&quot;&quot;,1)&amp;lt;0)&#123;&lt;br&gt;close(fd);&lt;br&gt;return -1;&lt;br&gt;    &#125;&lt;br&gt;    &lt;br&gt;&lt;br&gt;    if(lseek(fd,0,SEEK_SET)==(off_t)-1)&#123;&lt;br&gt;perror(&quot;lseek(2)&quot;);&lt;br&gt;cl</description>

<item>
    <title>mmap: Два файла в один массив (vic)</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/7386.html#7</link>
    <pubDate>Wed, 28 May 2008 09:07:11 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;и это, не стоит удалять память одним munmap вызывайте два, т.е. на &lt;br&gt;&amp;gt;&amp;gt;каждый выделенный кусок. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;какие то глюки... обновил глибсы на 2.7 и заработало. ненавижу такие пляски &lt;br&gt;&amp;gt;с глибсами:( &lt;br&gt;&amp;gt;щас откачусь обратно и попробую с MAP_FIXED. &lt;br&gt;&amp;gt;кстати я так и не понял куда мне его пихать этот getpagesize(2). &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;делать выравнивание до кратности размера страницы? &lt;br&gt;&lt;br&gt;как прально замечено надо юзать sysconf вместо getpagesize, ну и что-то типа:&lt;br&gt;&lt;br&gt;main()&lt;br&gt;&#123;&lt;br&gt;&lt;br&gt;//#define MAIN_SIZE 40960&lt;br&gt;//#define SWAP_SIZE MAIN_SIZE*2&lt;br&gt;&lt;br&gt;long sz = sysconf(_SC_PAGESIZE);&lt;br&gt;size_t MAIN_SIZE = sz * 10;&lt;br&gt;size_t SWAP_SIZE = MAIN_SIZE * 2;&lt;br&gt;&lt;br&gt;&#091;skiped&#093;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;зы: та не заработало с глибсами 2.7 просто падать стало горааааздо реже =)&lt;br&gt;MAP_FIXED просто принуждает выдавать ошибку вместо попытки использовать другой адрес вместо указанного, в мане предостерегают от использования этого флага, поэтому и написал выше вариант с пост-проверкой для swap_mem.&lt;br&gt;</description>
</item>

<item>
    <title>mmap: Два файла в один массив (yurkao)</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/7386.html#6</link>
    <pubDate>Tue, 27 May 2008 14:16:44 GMT</pubDate>
    <description>&amp;gt;все равно используйте getpagesize() &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;в обоих mmap используйте флаг MAP_FIXED, а не в одном, а лучше &lt;br&gt;&amp;gt;не используйте вообще, а после выделения проверяйте совпадение main_mem + MAIN_SIZE &lt;br&gt;&amp;gt;== swap_mem &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;и это, не стоит удалять память одним munmap вызывайте два, т.е. на &lt;br&gt;&amp;gt;каждый выделенный кусок. &lt;br&gt;&lt;br&gt;какие то глюки... обновил глибсы на 2.7 и заработало. ненавижу такие пляски с глибсами:(&lt;br&gt;щас откачусь обратно и попробую с MAP_FIXED.&lt;br&gt;кстати я так и не понял куда мне его пихать этот getpagesize(2).&lt;br&gt;делать выравнивание до кратности размера страницы?&lt;br&gt;</description>
</item>

<item>
    <title>mmap: Два файла в один массив (vic)</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/7386.html#5</link>
    <pubDate>Tue, 27 May 2008 12:42:16 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;       In  SUSv2  the &lt;br&gt;&amp;gt; getpagesize()  call is labeled &lt;br&gt;&amp;gt;       LEGACY, and in POSIX.1-2001 it &lt;br&gt;&amp;gt;has been dropped; HP-UX  does  not  have &lt;br&gt;&amp;gt;       this  call.   &lt;br&gt;&amp;gt;Portable applications should employ sysconf(_SC_PAGESIZE) &lt;br&gt;&amp;gt;       instead of this call. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;(c) man getpagesize(2) &lt;br&gt;&lt;br&gt;упс =)&lt;br&gt;</description>
</item>

<item>
    <title>mmap: Два файла в один массив (phpcoder)</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/7386.html#4</link>
    <pubDate>Tue, 27 May 2008 12:34:03 GMT</pubDate>
    <description>&amp;gt;все равно используйте getpagesize() &lt;br&gt;&lt;br&gt;       In  SUSv2  the  getpagesize()  call is labeled&lt;br&gt;       LEGACY, and in POSIX.1-2001 it has been dropped; HP-UX  does  not  have&lt;br&gt;       this  call.   Portable applications should employ sysconf(_SC_PAGESIZE)&lt;br&gt;       instead of this call.&lt;br&gt;&lt;br&gt;(c) man getpagesize(2)&lt;br&gt;</description>
</item>

<item>
    <title>mmap: Два файла в один массив (vic)</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/7386.html#3</link>
    <pubDate>Tue, 27 May 2008 12:21:40 GMT</pubDate>
    <description>&amp;gt;&amp;gt;читать man mmap на предмет getpagesize() &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;дык вот ведь какая штука: оффсет(0) и размеры памяти кратны размеру страницы &lt;br&gt;&amp;gt;(4096)... &lt;br&gt;&lt;br&gt;все равно используйте getpagesize()&lt;br&gt;&lt;br&gt;в обоих mmap используйте флаг MAP_FIXED, а не в одном, а лучше не используйте вообще, а после выделения проверяйте совпадение main_mem + MAIN_SIZE == swap_mem&lt;br&gt;&lt;br&gt;и это, не стоит удалять память одним munmap вызывайте два, т.е. на каждый выделенный кусок.&lt;br&gt;</description>
</item>

<item>
    <title>mmap: Два файла в один массив (yurkao)</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/7386.html#2</link>
    <pubDate>Tue, 27 May 2008 09:46:57 GMT</pubDate>
    <description>&amp;gt;читать man mmap на предмет getpagesize() &lt;br&gt;&lt;br&gt;дык вот ведь какая штука: оффсет(0) и размеры памяти кратны размеру страницы (4096)...&lt;br&gt;</description>
</item>

<item>
    <title>mmap: Два файла в один массив (vic)</title>
    <link>https://opennet.dev/openforum/vsluhforumID9/7386.html#1</link>
    <pubDate>Tue, 27 May 2008 08:26:10 GMT</pubDate>
    <description>читать man mmap на предмет getpagesize()&lt;br&gt;</description>
</item>

</channel>
</rss>
