Inferno-limbo-systemio

System I/O

sysの中身をいくつか解説。

sys->char2byte

n := sys->char2byte(c:int, buf:array of byte, n:int);

mu : array [Sys->UTFmax] of byte;
n := sys->char2byte(16r3bc,mu,0);

Unicodeなcharを UTF-8に変換する。

sys->print

sys->print ("%s\n",hoge);

sys->aprint

n := sys->aprint ("%s\n",hoge);

フォーマットにしたがってprintfできる。

sys->open

fd := sys->open("hoge",sys->OREAD)

|sys->OWRITE|書き込みで開く。ファイルがなければなにもしない?| |sys->OTRUNC| | |sys->OTRUNC| | |sys->ORCLOSE| |

sys->dup

# /dev/consを開く。consはbufferingされる。
consfd = sys->open("/dev/cons",sys->OREAD);
# File Descripter を別のあたらしい標準入力にduplicateする
sys->dup(consfd.fd,0);
# /dev/consを書くために開く
consfd = sys->open("/dev/cons",sys->OWRITE);

# stdoutとstderrの両方ともduplicateする
sys->dup(consfd.fd,1);
sys->dup(consfd.fd,2);

sys->read

n := sys->read(fd,buf,len buf)

# 改行コードがついてるから、取り除いたりする。
buf = buf[:n];

返り値は、読み込めたサイズ

sys->remove

n := sys->remove("hoge");

ファイルを消す。成功したら0、それ以外は-1が返る。

sys->write

n := sys->write(fd,buf,len buf)

sys->stream

n := sys->stream(fd_src, fd_dst, len buf)

fd_srcからの入力をfd_dstにlen bufだけ流し込む。

readとwriteをくりかえしゃいーじゃん、と思うなかれ。videoやaudioのコピー とかにも使えるようにチューニングしてあるんよ。streamはスケジューリングの 中で一番高い優先度を持つ。