#include    <stdio.h>
#include    <math.h>
#include    <fcntl.h>
#include    <sys/types.h>
#include    <unistd.h>
#include    <sys/mman.h>

typedef struct{
    char    str[512];
    long    lval;
    double  dval;
}SSS;

#define NUMBER (10000)

void main()
{
int     fd;
char    c;
long    psize,size;
SSS     *ptr;
long    i,lval;
double  dval;
char    buf[512];

    /* マップ用ファイルオープン */
    if((fd=open("MapFile",O_RDWR|O_CREAT,0666))==-1){
        perror("open");
        exit(-1);
    }

    /* ページサイズで境界合わせを行なったサイズを計算 */
#ifdef BSD
    psize=getpagesize();
#else
    psize=sysconf(_SC_PAGE_SIZE);
#endif
    size=(NUMBER*sizeof(SSS)/psize+1)*psize;

    /* ファイルの必要サイズ分先にシークし、0を書き込み */
    /* ファイルのサイズをマップしたいサイズにするため */
    if(lseek(fd,size,SEEK_SET)<0){
        perror("lseek");
        exit(-1);
    }
    if(read(fd,&c,sizeof(char))==-1){
        c='\0';
    }
    if(write(fd,&c,sizeof(char))==-1){
        perror("write");
        exit(-1);
    }

    /* マップ */
    ptr=(SSS *)mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    if((int)ptr==-1){
        perror("mmap");
        exit(-1);
    }

    /* テスト */
    while(1){
        /* 標準入力からデータ読み込み */
        fgets(buf,sizeof(buf)-1,stdin);
        if(feof(stdin)){
            break;
        }
        lval=atoi(buf);
        dval=atof(buf);
        /* 全データの値をセット */
        for(i=0;i<NUMBER;i++){
            strcpy(ptr[i].str,buf);
            ptr[i].lval=lval;
            ptr[i].dval=dval;
        }
        /* 実際にファイルに書き込みたい場合はmsync()する */
        /* msync(ptr,size,MS_ASYNC); */
    }

    /* 実際にファイルに書き込み、同期を取る */
    msync(ptr,size,0);

    /* アンマップ */
    if(munmap(ptr,size)==-1){
        perror("munmap");
    }

    /* ファイルクローズ */
    close(fd);
}
