プログラミング言語C – UNIXシステム・インタフェース read/write,lseek
津路です。
プログラミング言語C 第2版 ANSI規格準拠 K&R著(共立出版)を読んで、気になるところを書いています。
今回は、第8章 UNIXシステム・インタフェースです。
8.2 低水準入出力 – Read と Write
次のコードが掲載されています。
#include "syscalls.h"
main() /* 入力を出力にコピーする */
{
char buf[BUFSIZ];
int n;
while ((n = read(0, buf, BUFSIZ)) > 0)
write(1, buf, n);
return 0;
}
このコードについて、以下の説明があります。
「このsyscalls.h の中では、パラメータ BUFSIZ も定義されている。その値はローカルなシステムで適当に決めればよい。ファイルのサイズが BUFSIZ の倍数でなければ、read は write で書くべきバイト数よりも小さい数値を返してくることがある。このとき、次の read 呼び出しでは、0 が返されるであろう。」
BUFSIZ は適当に決めれば良いのでしょうか? まさか。。原文は、its value is a good size for the local system. ローカルなシステムにふさわしい値である、というような意味では?
しかも、syscalls.h というファイルは、ありません。どうも著者が書いた時にはローカルにあったかもしれませんが。第3文「ファイルのサイズが BUFSIZ の倍数でなければ、read は write で書くべきバイト数よりも小さい数値を返して」まさか。。これは、「BUFSIZ の倍数でなければ、read は BUFSIZ よりも小さい数値を返してくることがある。そのあと、次の read呼び出しでは、0が返されるであろう。」でしょう。
8.4 ランダム・アクセス – Lseek
long lseek(int fd, long offset, int origin);
「は、ファイル記述子がfdであるファイルの中の現在の位置を、origin で指定した場所に相対的にとられる offset 位置へ移動させる。次の読み書きはその位置からとなる。originは、offsetがそれぞれファイルの最初、現在の位置、終わりのいずれから測られるかによって0,1,2に指定できる。例えば、あるファイルに追加(UNIXシェルでは切換えの>>, あるいはfopenでは”a”)したいときには、書き込む前にファイルの終わりを捜す。」
という文章が書かれていますが、チンプンカンプンです。
原文は、「sets the current position in the file whose descriptor is fd to offset, which is
taken relative to the location specified by origin. Subsequent reading or writing
will begin at that position. origin can be 0, 1, or 2 to specify that
offset is to be measured from the beginning, from the current position, or
from the end of the file respectively. For example, to append to a file (the
redirection >> in the UNIX shell, or “a” for f open), seek to the end before
writing:」
つぎのように書きたいところです。
「は、記述子がfdのファイルの現在位置を、originで指定された位置と相対的に見て、offsetずらす。そのあとのread, writeは、移動後の位置からとなる。origin は、0, 1, 2いずれかで、順にファイルの先頭、現在位置、末尾を指し、offsetはいずれかを起点とする。例えば、ファイルに追加(UNIX シェルでは リダイレクション >>, またはfopenでは”a”)する際、writeする前に末尾へ移動するには、
lseek(fd, OL, 2);
とする。」
続きは、次回に。。