システム・プログラム
電子・情報工学系
新城 靖
<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 %
----------------------------------------------------------------------