システム・プログラム 電子・情報工学系 新城 靖 <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
ファイルの内容を操作する方法として、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/passwdroot: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 %
----------------------------------------------------------------------