自由課題

学んだり、考えたり、試したりしたこと。

声に出して読みたいUNIX&LINUXライブラリ関数

"LINUXプログラミングインターフェイス"という本を読みました。 この本は、"本書は Linux および UNIX システムプログラミング API の(ほぼ)完全な解説を目標とし、内容 は広範囲の Linux プラットフォームに通用するもの(まえがきより)"ということで、約1500ページに渡りPOSIX/SUS API及びLINUX独自のシステムコールについて広範な解説を行っている書籍です。

Linuxプログラミングインタフェース

Linuxプログラミングインタフェース

せっかく読んだので何かアウトプットを出したいと思い、知らなかったけれど便利そうなAPIの一部を並べてみることにしました。自分が知らなかったものなので特にジャンル(?)はなく雑多です。

tmpfile()

#include<stdio.h>

FILE* tmpfile(void);

このAPIは名前の通り一時ファイルを作成してくれる関数です。(manpageはこちら) mktemp()tmpnam()を使用した場合、mktemp()呼び出し〜fopen()呼び出しに間が空くことにより排他やセキュリティの問題が生じる恐れがありますが、本関数を使用するとAPIの中で一時ファイル名を決定しファイルオープンまで行ってくれますのでこれらの心配がありません。

似たような役割のAPIとしてmkstmp()がありますが、こちらの関数はファイルのテンプレート(ファイル名のprefix)を用意しなければならないため、本関数より多少面倒です。裏を返せばmkstemp()のほうがコントロールが効きます。

また、本関数の良いところとして、本関数で作成したファイルはfclose()もしくはプログラムの終了時に自動的に削除される点が挙げられます。よくある一時ファイルを消し忘れる問題が発生することもありません。

pthread_cleanup_push()

#include <pthread.h>

void pthread_cleanup_push(void (*routine) (void *), void *arg);
void pthread_cleanup_pop(int execute);

本関数はPOSIXスレッドが終了した時のクリーンアップ関数を設定する関数です。(manpageはこちら)
pushという名前が示すように、本関数及び対となるpthread_cleanup_pop()関数により、クリーンアップ関数はスタック状に設定を積み重ねられます。例えば、処理が進行するにつれてクリーンアップ関数を随時追加することができます。

実際使ってみると思うところはありそうですが、機会があれば使ってみたいです。

popen()

#include <stdio.h>

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);

本関数はプロセスを起動する関数です。(manpageはこちら)
コマンドを実行するという意味ではsystem()と似ていますが、本関数でtype引数で指定することにより、入力または出力のためのパイプを作成することができます。加えてsystem()と異なりプロセス実行中に呼び出し側がブロックされることもありません。pclose()でパイプのクローズとプロセスの終了待ち合わせを行います。

mremap()

#include <sys/mman.h>

void *mremap(void *old_address, size_t old_size,
             size_t new_size, int flags, ... /* void *new_address */);

本関数はマップされたメモリ領域のサイズを変更する関数です。(manpageはこちら)
本関数はLINUXのみで提供されている関数です。サイズを拡大する場合の挙動(アドレス変更する or アドレス変更が必要ならエラー)も選択できるようです。

close-on-execフラグ

open()で指定できるO_CLOEXECです。これはexecv()等で別のプログラムを実行するときに、他のプログラムにオープン済みのファイルへのアクセスをさせないためのオプションです。様々なAPIで設定できるようになっており、"LINUXプログラミングインターフェイス"内でも何度も取り上げられています。

個人的にはコーディングするプログラム内で他のプログラムを呼び出すことはほとんどないのですが、確かにセキュリティ上重要なオプションだと思うので覚えておきます。

さいごに

ということで、自分の無知をさらけ出しつついくつかのAPIを紹介しました。他にopenat()など、知らなかったけれど便利そうなものをいくつか知ることができました。
"LINUXプログラミングインターフェイス"は、UNIXプログラミングを行う方であれば六法全書的に机の上に置いておくのも良いと思います(なにか箔がついた感じもするかもしれませんし)が、この本は分厚すぎるということであれば、

Linuxシステムプログラミング

Linuxシステムプログラミング

あたりもよいと思います。(単に物理的に重いのが問題であればこちらから電子書籍も買えます。私は電子書籍版を買いました。)

また、最近似たような立ち位置の書籍と見られる

詳解UNIXプログラミング 第3版

詳解UNIXプログラミング 第3版

も最近出版されたので、こちらをチェックしてみるのも良いかも知れません。ただしこの本も1000ページ近くあるようです。