Linux programming interface 3章システムプログラミング

断片的な読書メモです。

3.5章にサンプルコードについての説明がある。Makefileは本には記載されていないので、下記のサポートページからソースを一式ダウンロードして確認する。

Source code of the Programs in "The Linux Programming Interface"

この章で導入しているエラー処理ライブラリをビルドすると、 libtlpi.aというスタティックライブラリが作成される。

ビルドメモ:

  • @ echo ${BUILD_DIRS} のように@をコマンドの前につけると、make時にそのコマンドの出力が抑制される
  • gccには関数属性をチェックする機能がある。__attribute__ ((__noreturn__))と書くと-Wallコンパイルしたときに、呼び出し元に戻らない関数に対する警告文を出さないようにできる。関数のプロトタイプ宣言時にvoid hoge() __attribute__ ((__noreturn__))のように記載

snprintf

snprintf()の使い方 (sprintf()はバッファーオーバーランの可能性があるので使わない)

/*配列bufを初期化してないが、fputs()で¥0まで読み込むからいいのかな*/
# define BUFSIZE 500 
char buf[BUFSIZE]; /*余裕を持ったサイズの文字配列を宣言*/

snprintf(buf, sizeof(buf), "ERROR: %s", my_error); /*終端文字の¥0も含めて最大sizeof(buf)の値をbufに書き込む*/
fputs(buf, stderr); /*終端文字¥0は書き込まない*/
fflush(stderr);

strtol

manページの例がわかりやすい。文字列をlong型の整数に変換。 atoi()関数もあるが、これはエラー処理ができないのでstrtol()を使った方が良いようだ。詳細はman strtol