2007-03-19 :-)
_ [写経][UNIX][VMware][NetBSD][プログラミング]詳解 UNIX プログラミング写経
WindowsXP 上の VMWare 上の NetBSD
プログラム 3.2。lseek() です。ファイルを作って 10 バイト埋めて 40 バイト lseek() して 10 バイト埋めるコードです。creat() の第三引数 mode ってなんだ!? man creat しても mode について書いていない。とりあえず 0 にしてみます。
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> char buf1[] = "abcdefghij"; char buf2[] = "ABCDEFGHIJ"; int main( int ac, char** av ) { int fd; if( ( fd = creat( "file.hole", 0 ) ) < 0 ) err( EXIT_FAILURE, "creat error\n" ); if( write( fd, buf1, 10 ) != 10 ) err( EXIT_FAILURE, "write error\n" ); if( lseek( fd, 40, SEEK_SET ) == -1 ) err( EXIT_FAILURE, "lseek error\n" ); if( write( fd, buf2, 10 ) != 10 ) err( EXIT_FAILURE, "write error\n" ); return 0; }
実行。なるほど。chmod 000 ということでしょうか。
% ./a.out % ls -l file.hole ---------- 1 rin users 50 Mar 19 16:50:17 2007 file.hole
owner も 0 なので読み書きできません。
% ./a.out a.out: creat error : Permission denied
sudo して rm しておきます。
% sudo rm file.hole
どうやら chmod の mode のようなので man chmod したら mode の説明がありました。S_IRWXU しておきます。
if( ( fd = creat( "file.hole", S_IRWXU ) ) < 0 )
実行。chmod 700 ということすね。
% ./a.out % ls -l file.hole -rwx------ 1 rin users 50 Mar 19 16:51:31 2007 file.hole*
ファイルはこんな中身になります。真ん中 30 バイトは 0 で埋められます。
% od -c file.hole 0000000 a b c d e f g h i j \0 \0 \0 \0 \0 \0 0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000040 \0 \0 \0 \0 \0 \0 \0 \0 A B C D E F G H 0000060 I J 0000062
_ [写経][UNIX][VMware][NetBSD][標準入力][標準出力][プログラミング]詳解 UNIX プログラミング写経
WindowsXP 上の VMWare 上の NetBSD
プログラム 3.3。標準入力から読んで標準出力へ印字します。
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #define BUFFSIZE 8192 int main( int ac, char** av ) { int n; char buf[ BUFFSIZE ]; while( ( n = read( STDIN_FILENO, buf, BUFFSIZE ) ) > 0 ) if( write( STDOUT_FILENO, buf, n ) != n ) err( EXIT_FAILURE, "write error\n" ); if( n < 0 ) err( EXIT_FAILURE, "read error\n" ); return 0; }
詳解 UNIX プログラミング p.54 ではいくつか BUFFSIZE を変更して処理にかかった時間を計測しています。
このテストに用いたファイルシステムは、ブロックサイズが 8192 バイトのバークレーの fast filesystem である。これが、BUFFSIZE が 8192 の場合にシステム時間が最小である理由である。これよりバッファサイズを大きくしても効果はない。( p.55 )
ブロックサイズは df -P で確認できるようです。512 かしら。いいのかな。
% df -P Filesystem 512-blocks Used Available Capacity Mounted on /dev/wd0a 1058722 70230 935556 6% / /dev/wd0e 5955426 4168740 1488916 73% /usr /dev/wd0f 12295016 4414890 7265376 37% /home
ブロックサイズ 1 メガで 256 メガバイトのファイルを作ってみます。
% dd if=/dev/zero of=3.3.out bs=1m count=256 256+0 records in 256+0 records out 268435456 bytes transferred in 3.907 secs (68706285 bytes/sec)
BUFFSIZE を変更して実行してみます。
BUFFSIZE 1
% time ./a.out < 3.3.out > /dev/null ./a.out < 3.3.out > /dev/null 409.08s user 1536.40s system 99% cpu 32:26.61 total
BUFFSIZE 512
./a.out < 3.3.out > /dev/null 0.10s user 7.34s system 92% cpu 8.012 total
BUFFSIZE 8192
./a.out < 3.3.out > /dev/null 0.00s user 2.42s system 79% cpu 3.050 total
BUFFSIZE 65536
./a.out < 3.3.out > /dev/null 0.00s user 2.42s system 81% cpu 2.953 total
あれ。システムのブロックサイズが 512 ( だよね ) だけど実行結果は BUFFSIZE 8192 以降が最速ですね...。
_ [Firefox] [☆] Make LinkはCopy URL+よりも使いやすい
( via HsbtDiary )
入れてみました。
右クリックのコンテキストメニューから Meta link → Configure... とすると新しく作れます。tDiary の wiki スタイルや hiki で使う書式を設定してみました。名前を hiki mode とします。こんな設定。
[[%TEXT%|%URL%]]
設定したあとに Firefox を再起動しないと設定が有効にならないみたいです。
Meta link → hiki mode をクリック
こんなのがコピーされます。良いですね。
[[ヨタの日々|http://www.area51.gr.jp/~rin/diary/]]
df -P は blocksize とちがうんじゃないですかね?<br>disklabel(8) で見られると思います。(fsize と bsize)<br><br>permission 000 のファイルは、ディレクトリの w をもっているなら root じゃなくても rm できます。<br>(rm は文句を言うが、y で消せる。<br>あるいは chmod +w しておけば rm も文句を言わない。<br>chmod はもちろん sudo しなくても動く)