ファイルをメモリに張り付ける

システム・プログラム

                                       電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/syspro-2000/2000-04-24 /mmap.html
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/
http://www.is.tsukuba.ac.jp/~yas/index-j.html

■mmap

ファイルの内容を操作する方法として、read(), write() とは全く違った方法 がある。それは、ファイルの内容をメモリにマップ(map, 張り付ける)し、 ファイルの内容を配列のようにして扱う方法である。


----------------------------------------------------------------------
   1:	
   2:	/*
   3:	        mmap-head.c -- mmap(2) を使った head プログラム
   4:	        $Header: /home/lab2/OS/yas/syspro1/file/RCS/mmap-head.c,v 1.1 1998/05/11 16:06:46 yas Exp $
   5:	        ~yas/syspro1/file/mmap-head.c
   6:	        <-- mmap-cat.c,v 1.1 1997/05/12 22:56:02 yas Exp $
   7:	        Start: 1998/05/12 01:06:15
   8:	*/
   9:	
  10:	#include <stdio.h>      /* stderr */
  11:	#include <sys/types.h>  /* open(),mmap() */
  12:	#include <sys/stat.h>   /* open() */
  13:	#include <fcntl.h>      /* open() */
  14:	#include <sys/mman.h>   /* mmap() */
  15:	
  16:	extern void mmap_head( char *name );
  17:	extern char *mmap_file( char *name /* in */, size_t *filesizep /* out */);
  18:	
  19:	void main( int argc, char *argv[] )
  20:	{
  21:	        if( argc != 2 )
  22:	        {
  23:	            fprintf( stderr,"Usage: %% %s filename\n",argv[0] );
  24:	            exit( 1 );
  25:	        }
  26:	        mmap_head( argv[1] );
  27:	}
  28:	
  29:	void mmap_head( char *name )
  30:	{
  31:	    size_t size,i ;     /* unsigned int */
  32:	    char *file_address ;
  33:	    int nlcount ;
  34:	
  35:	        file_address = mmap_file( name,&size );
  36:	        if( ((int)file_address) == -1 )
  37:	        {
  38:	            perror( name );
  39:	            exit( 1 );
  40:	        }
  41:	        for( i = 0, nlcount=0 ; i<size ; i ++ )
  42:	        {
  43:	            if( file_address[i] == '\n' )
  44:	            {
  45:	                 nlcount ++ ;
  46:	                 if( nlcount >= 10 )
  47:	                 {
  48:	                     i++ ;
  49:	                     break;
  50:	                 }
  51:	            }
  52:	        }
  53:	        write( 1, file_address, i );
  54:	}
  55:	
  56:	char *mmap_file( char *name /* in */, size_t *filesizep /* out */)
  57:	{
  58:	    int fd ;
  59:	    struct stat buf ;
  60:	    size_t size,p ;     /* unsigned int */
  61:	    off_t off ;         /* long */
  62:	    caddr_t addr ;      /* char * */
  63:	        if( (fd = open( name,O_RDONLY )) == -1 )
  64:	            return( (char *)-1 );
  65:	        fstat( fd, &buf );
  66:	        size = buf.st_size ;
  67:	        addr = 0 ;      off = 0 ;
  68:	        addr = mmap( addr, size, PROT_READ, MAP_PRIVATE, fd, off );
  69:	        if( (int)addr == -1 )
  70:	        {
  71:	            close( fd );
  72:	            return( (char *)-1 );
  73:	        }
  74:	        close( fd );
  75:	        if( filesizep )
  76:	            *filesizep = size ;
  77:	        return( addr );
  78:	}
----------------------------------------------------------------------

実行例。
----------------------------------------------------------------------
% ./mmap-head /etc/passwd  [←]
root:aBcDefGhijklmN:0:0:Super-User:/:/bin/csh
sysadm:*:0:0:System V Administration:/usr/admin:/bin/sh
diag:*:0:996:Hardware Diagnostics:/usr/diags:/bin/csh
daemon:*:1:1:daemons:/:/dev/null
bin:*:2:2:System Tools Owner:/bin:/dev/null
uucp:*:3:5:UUCP Owner:/usr/lib/uucp:/bin/csh
sys:*:4:0:System Activity Owner:/var/adm:/bin/sh
adm:*:5:3:Accounting Files Owner:/var/adm:/bin/sh
lp:*:9:9:Print Spooler Owner:/var/spool/lp:/bin/sh
nuucp:*:10:10:Remote UUCP User:/var/spool/uucppublic:/usr/lib/uucp/uucico
% []
----------------------------------------------------------------------

↑[もどる] ←[4月17日] ・[4月24日] →[5月01日] [課題]
Last updated: 2000/04/23 02:04:04
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>