へっぽこ社会人4年生がプログラミングを頑張る

へっぽこ社会人4年目がプログラミング系統を中心に書きたいことをつらつらと書きます

システムコールで遊んでみる その1

最近のマイブームは、 システムコールを使った Cプログラムを組むことです。

というわけで、

気が向いた時に、ちょいちょいと システムコールで遊んでみたことを 書いてみようかなと思います。

さて、前置きが長くなりましたが、 今回はreadwriteについて 簡単ながら書いてみようかと。 今回は、標準入力からの入力を 標準出力に出力するだけの 単純なプログラムを組んでみます。

#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;
}
ちょっと解説(っぽいもの)

readwriteを利用するためには unistd.hという ヘッダファイルを インクルードする必要があります。 readの返り値は 成功の場合、実際に読み込まれた データのバイト数が、 失敗の場合 -1が返されます。 writeの返り値は 成功の場合、実際に書き込まれた データのバイト数が、失敗の場合 -1が返されます。

readwriteの インタフェースは以下の通り。

  • 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引数bufreadの場合、 データの格納を、 writeの場合、 格納されたデータの出力を行うために 利用します。 第3引数nbytereadの場合、 bufに読み込む データサイズを、 writeの場合、 bufに書き出す データサイズを指定します。  今回の場合、 標準入力 からデータを読み込み、 標準出力 にデータを出力したいので、 readディスクリプタは0、 writeディスクリプタは1 となります。 もちろん、それぞれディスクリプタに 直接数字を入れ込んでも 良いんでしょうけど、 せっかくなので、マクロを利用します。 標準入力STDIN_FILENO標準出力STDOUT_FILENOが 定義されています。 readディスクリプタには STDIN_FILENOを、 writeディスクリプタには STDOUT_FILENOを指定します。

詳しくは、man 2 readman 2 writeと ターミナルに入力してマニュアルを 呼び出してみてください。

第2引数のvoid *bufは、 バッファへのポインタに なっているのですが、 これって構造体へのポインタとかでも 問題ないんでしょうか...? 今後調査したいと思います。

とりあえず、かなり適当ですけれど、 今回はここまで。 次はopenで 遊んでみようかなと考えてます。