システム・プログラム
電子・情報工学系
新城 靖
<yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/syspro-2000/2000-04-24
/struct.html
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/coins/
http://www.is.tsukuba.ac.jp/~yas/index-j.html
高水準(ライブラリ)の入出力機能を使って構造体を読み書きするには、 fread(), fwrite() を使う。
ポータビリティ(別のOSやCPUのコンピュータでも使う)を考える時には、 文字コード、バイトオーダー、浮動小数点の形式、構造体の穴に注意する。 (XDR ライブラリを使えば、ポータビリティが高くなる。XDR については、3 学期の「分散システム」で。)
----------------------------------------------------------------------
1:
2: /*
3: utmp-print.c -- /var/adm/utmp の内容を表示するプログラム
4: ~yas/syspro1/file/utmp-print.c
5: $Header: /home/lab2/OS/yas/syspro1-1998/file/RCS/utmp-print.c,v 1.4 1998/05/11 14:54:49 yas Exp $
6: Start: 1995/03/06 09:01:09
7: */
8:
9: #include <stdio.h> /* FILE, NULL, stderr */
10: #include <utmp.h> /* struct utmp */
11: #include <time.h> /* ctime() */
12:
13: #if 0
14: struct utmp
15: {
16: char ut_user[8] ; /* User login name */
17: char ut_id[4] ; /* /etc/inittab id(usually line #) */
18: char ut_line[12] ; /* device name (console, lnxx) */
19: short ut_pid ; /* leave short for compatiblity - process id */
20: short ut_type ; /* type of entry */
21: struct exit_status ut_exit ;/* The exit status of a process
22: * marked as DEAD_PROCESS.
23: */
24: time_t ut_time ; /* time entry was made */
25: } ;
26: #endif
27:
28: void utmp_print_file();
29: void utmp_print( struct utmp *u );
30: void print_char_array( char a[], int len );
31:
32: main()
33: {
34: utmp_print_file();
35: }
36:
37: void utmp_print_file()
38: {
39: struct utmp entry;
40: FILE *fp ;
41: fp = fopen( UTMP_FILE, "r" );
42: if( fp == NULL )
43: {
44: perror( UTMP_FILE );
45: exit( -1 );
46: }
47: while( fread(&entry, sizeof(entry),1,fp ) == 1 )
48: {
49: utmp_print( &entry );
50: }
51: fclose( fp );
52: }
53:
54: void utmp_print( struct utmp *u )
55: {
56: print_char_array( u->ut_user, sizeof(u->ut_user) );
57: print_char_array( u->ut_id, sizeof(u->ut_id) );
58: print_char_array( u->ut_line, sizeof(u->ut_line) );
59: printf("%6d ", u->ut_pid );
60: printf("%6d ", u->ut_type );
61: printf("%s",ctime(&u->ut_time) );
62: }
63:
64: void print_char_array( char a[], int len )
65: {
66: int i ;
67: for( i=0 ; i<len && a[i] ; i++ )
68: putchar( a[i] );
69: for( ; i<len ; i++ )
70: putchar(' ');
71: putchar(' ');
72: }
----------------------------------------------------------------------
ut_time には、1970年1月1日0:00(GMT)からの秒数で時刻 が含まれている。
実行結果
---------------------------------------------------------------------- % ./utmp-printsystem boot 0 2 Sun Apr 26 05:32:18 1998 run-level 2 0 1 Sun Apr 26 05:32:18 1998 lnsyscon link 32 8 Sun Apr 26 05:32:18 1998 rc2 s2 35 8 Sun Apr 26 05:33:27 1998 LOGIN t1 ttyd1 703 6 Sun Apr 26 05:33:28 1998 rlogin q0 ttyq0 11481 8 Mon May 11 23:24:53 1998 yas q1 ttyq1 11506 7 Mon May 11 23:24:45 1998 yas q2 ttyq2 11521 7 Mon May 11 23:24:59 1998 i97???? q3 ttyq3 265 8 Sat May 9 18:01:24 1998 t??? q4 ttyq4 28706 8 Wed May 6 13:55:54 1998 s??? q5 ttyq5 2818 8 Sun Apr 26 16:40:12 1998 s??? q6 ttyq6 2889 8 Sun Apr 26 17:05:52 1998 s??? q7 ttyq7 2890 8 Sun Apr 26 17:05:52 1998 % who
yas ttyq1 5月 11日 23時24分 yas ttyq2 5月 11日 23時24分 %
----------------------------------------------------------------------
次のような長い表示をするUNIXの who コマンドと似た動きをするプログラム を作りなさい。
括弧の中は、ログインしてきたホスト名やXウィンドウのディスプレイの名前。---------------------------------------------------------------------- % whoyas ttyp0 Apr 28 20:32 (top:0.0) yas ttyp1 May 11 22:19 (revolution) yas ttyp2 May 11 20:03 (hlla0:0.0) % ----------------------------------------------------------------------
ヒント:utmp ではなく、utmpx を使うとよい。
ヒント:日付の表示は、上の例のように ctime() を使う方法でよい。 あるいは、localtime() や strftime() を使う方法もある。
wtmp ではなく wtmpx を使うと、ホスト名まで調べられる。
% present user 2000/04/24-10:10 2000/04/24-11:30と与えると、ユーザ名user のユーザが、その時間にログインしていたら、OK を返す。