最近のマイブームは、 システムコールを使った Cプログラムを組むことです。
というわけで、
気が向いた時に、ちょいちょいと システムコールで遊んでみたことを 書いてみようかなと思います。
さて、前置きが長くなりましたが、 今回はread
と write
について 簡単ながら書いてみようかと。 今回は、標準入力からの入力を 標準出力に出力するだけの 単純なプログラムを組んでみます。
#include <unistd.h>
#define MAXSIZE 65536
int main(int argc, char **argv)
{
char msg[MAXSIZE];
ssize_t len;
len = read(STDIN_FILENO, msg, MAXSIZE);
write(STDOUT_FILENO, msg, len);
return 0;
}
ちょっと解説(っぽいもの)
read
と write
を利用するためには unistd.h
という ヘッダファイルを インクルードする必要があります。 read
の返り値は 成功の場合、実際に読み込まれた データのバイト数が、 失敗の場合 -1が返されます。 write
の返り値は 成功の場合、実際に書き込まれた データのバイト数が、失敗の場合 -1が返されます。
read
と write
の インタフェースは以下の通り。
read
ssize_t read(int fd, void *buf, size_t nbyte);
write
ssize_t write(int fd, void *buf, size_t nbyte);
第1引数
fd
は ファイルディスクリプタを指定します。 第2引数buf
は read
の場合、 データの格納を、 write
の場合、 格納されたデータの出力を行うために 利用します。 第3引数nbyte
は read
の場合、 buf
に読み込む データサイズを、 write
の場合、 buf
に書き出す データサイズを指定します。 今回の場合、 標準入力 からデータを読み込み、 標準出力 にデータを出力したいので、 read
のディスクリプタは0、 write
のディスクリプタは1 となります。 もちろん、それぞれディスクリプタに 直接数字を入れ込んでも 良いんでしょうけど、 せっかくなので、マクロを利用します。 標準入力はSTDIN_FILENO
、 標準出力はSTDOUT_FILENO
が 定義されています。 read
のディスクリプタには STDIN_FILENO
を、 write
のディスクリプタには STDOUT_FILENO
を指定します。詳しくは、man 2 read
や man 2 write
と ターミナルに入力してマニュアルを 呼び出してみてください。
第2引数のvoid *buf
は、 バッファへのポインタに なっているのですが、 これって構造体へのポインタとかでも 問題ないんでしょうか...? 今後調査したいと思います。
とりあえず、かなり適当ですけれど、 今回はここまで。 次はopen
で 遊んでみようかなと考えてます。