GNU catを読む - 全体的な流れ

GNU catのソース読んでます。長くなってきたので分割しました。

ソースコードのありか

グローバル

小さな関数

main()

  • getopt_longは定番の処理。
  • fstat (STDOUT_FILENO, &stat_buf)の意味がイマイチわからん。STDOUTのfstat??何が出てくる??
    • 調べた。cat > output.textとするとレギュラーファイルS_ISREG()がtrue,アウトプットにファイルを指定しない場合は、キャラクターデバイスS_ISCHR()がtrueになる。
    • 参照。
      • 詳解UNIX4.2,4.3
      • ふつりな10.8
      • man 2 statのmode flagsあたり。
    • そのうち詳しくやろうかな。
  • /* main loop */直後に-(標準入力)の処理がある。
  • STREQは、strcmpのマクロ。
  • isatty - ディスクリプタが端末かどうか。
  • fropen()はストリームを指定してファイルを開く。
  • O_BINARYはにない。lib/fcntl_.hで定義されてる。たぶん非標準。
  • check_redirectionフラグを見て、インプットとアウトプットが同じファイルだとエラーを吐く。頭良いデス。
% cat hoge.txt > hoge.txt
cat: hoge.txt: input file is output file
  • ptr_alignはsystem.hにある。system.hは便利関数&マクロ詰まりまくり。必見。
  • ST_BLKSIZEマクロは基本的にstat.st_blksizeを返す。取得出来ない場合は、# define DEV_BSIZE 4096辺りを返すみたい。system.h参照。
  • pageがイマイチわかってない。
    • manから引用。getpagesize() 関数はページの大きさをバイト数で返す。ここでの「ページ」は mmap(2) の説明の中で使用されているもので 、mmap() はこのページサイズの単位でファイルをマップする。
    • 移植性が必要なアプリケーションでは、このシステムコールの代わりに sysconf(_SC_PAGESIZE) を利用すべきである。 えぇぇぇ。
    • 全然わからん。うぅぅぅ。
    • お!プログラミングLinux 12.2メモリマッピングに書いてあった。買って正解だったぜ980円やるな!!しかし・・・長い・・・。
    • xmalloc (insize + page_size - 1)とメモリを確保すれば充分なメモリサイズの目安になりそうだ(違うかも)
    • ptr_align (inbuf, page_size)で、バッファメモリの先頭を出してる。複雑・・・。

cat()

  • cat()で処理されるフラグはこれだけ。フラグが立ってない時はsimple_cat()へGO!
    • bool show_nonprinting
    • bool show_tabs
    • bool number
    • bool number_nonblank
    • bool show_ends
    • bool squeeze_blank -sオプション。連続した空白行をまとめる。かなり有用。

ソースから見たcatの役割

  • ファイルを連結する。
  • 連続空白行をまとめる。(空白行は1つだけになる)
  • 行番号を見る。
  • 可視化。

あぁ・・・catのソースだけでも知らないことだらけだ・・・。思った以上に収穫が大きい。

GNU cat侮るなかれ。読むべし。