/stdlinux2-source

ふつうのLinuxプログラミング第2版ソースコード

Primary LanguageC

『ふつうのLinuxプログラミング』第2版 サンプルコード

このディレクトリには『ふつうのLinuxプログラミング第2版』の サンプルコード (+ α) が収録されています。

サポートサイト: http://i.loveruby.net/stdlinux2/

必要環境

プログラムをビルドするにはLinuxとgcc、GNU makeが必要です。 動作確認は以下の環境で行いました。

  • Ubuntu Linux Desktop 16.04 LTS
  • CentOS 7.3

ビルド方法

このディレクトリにcdし、コマンドラインでmakeコマンドを実行するとすべてのプログラムをビルドできます。 make test でテストを実行します。

ライセンス

このディレクトリに含まれるソースコードはすべて青木峰郎が 著作権を保持しており、MITライセンスに基きライセンスします。 即ち、目的や対価の有無に関らず変更・再配布・他のプログラム への組み込みなどを許可します。ただしこのプログラムを利用した 結果生じたトラブルなどについては、いかなる場合も著者ならびに 出版社は責任を負いかねます。

青木峰郎 / Minero Aoki

ソースコード一覧

第1章

hello.c
ありがちなHello, World!
args.c
コマンドライン引数を表示するプログラム
segv.c
NULLポインタを参照するだけのプログラム。 確実にsegmentation faultを起こす。
echo.c
簡単なechoコマンド。

第4章

bell.c
端末のベルを鳴らすプログラム

第5章

cat.c
簡単なcatコマンド (システムコール版)
cat0.c
cat.cからエラー処理を取り除いたコード
cat3.c
問題5-1の解答例。 コマンドライン引数がないときはstdinを読むcatコマンド
wc-l-syscall.c
問題5-2の解答例。 標準入力からテキストを読み込み、その行数を表示する。

第6章

cat2.c
stdioを使ったcatコマンド
getcperf.c
fgetcとgetcの速度を比較するためのプログラム。 何もコマンドライン引数を付けないとgetcを使い、 コマンドライン引数で「f」を渡すとfgetcを使う。
feof-bug.c
feofを使ったときに起こる有名なバグを確認するコード。 このプログラムの標準入力にテキストファイルをリダイレクトして実行すると、 最後の行が 2 回表示される。
cat-escape.c
問題6-1の解答例。 タブを「\t」、改行を「$」+ 改行で表示するcatコマンド
wc-l-stdio.c
問題6-2の解答例。 標準入力からテキストを読み込み、その行数を表示する。
cat5.c
問題6-3の解答例。 freadとfwriteを使ったcatコマンド。

第7章

head.c
簡単なheadコマンド。stdinのみ読む。
head2.c
簡単なheadコマンド。コマンドライン引数のファイルも読む。
head3.c
簡単なheadコマンド。 getoptでコマンドラインオプションを解析する例。
head4.c
簡単なheadコマンド。 getopt_longでコマンドラインオプションを解析する例。
gdb/*
gdbのテストに使ったファイル。
cat4.c
問題7-1の解答例。 -eオプションでcat-escape.cと同じ効果を発揮する catコマンド。
tail.c
問題7-2の解答例。 簡単なtailコマンド(出力行数固定)。

第8章

grep.c
8章で作成したgrepコマンド
array.c
文字列と文字の配列が等しいことを確認するコード
wgrep.c
wchar を使ってマルチバイト文字にも対応した grep コマンド。 固定文字列しか検索できない。
grep2.c
問題 8-1の解答例。 -iオプションと-vオプションのついたgrepコマンド。
slice.c
問題8-2の解答例。 マッチした部分を出力する。

第10章

ls.c
簡単なlsコマンド。
catdir.c
opendirを使わずディレクトリを読むコマンド。 ./catdir . | strings とするとなんとなくlsっぽい表示ができる。
mkdir.c
簡単なmkdirコマンド。mkdir(2)の使用例。
rmdir.c
簡単なrmdirコマンド。rmdir(2)の使用例。
ln.c
簡単なlnコマンド。link(2)の使用例。
symlink.c
簡単なln -sコマンド。symlink(2)の使用例。
rm.c
簡単なrmコマンド。unlink(2)の使用例。
mv.c
簡単なmvコマンド。rename(2)の使用例。
stat.c
コマンドライン引数で指定されたファイルの付帯情報を表示する。 lstat(2)の使用例。
touch.c
簡単なtouchコマンド。utime(2)の使用例。 このコマンドは時刻を更新するだけで、ファイルを作る機能はない。
chmod.c
簡単なchmodコマンド。chmod(2)の使用例。
chown.c
簡単なchownコマンド。chown(2)とgetpwnam(3) の使用例。
chgrp.c
簡単なchgrpコマンド。chgrp(2)の使用例。
traverse.c
問題10-1の解答例。 コマンドライン引数で指定したディレクトリをトラバースして中にあるファイルを表示するプログラム。
mkpath.c
問題10-3の解答例。 複数階層のディレクトリツリーを再帰的に作成する。

第11章

mapwrite.c
mmap(2) のテストプログラム。
shlib/*
共有ライブラリを作成する例 [Linux only]
link/*
ライブラリのダイナミックリンクとダイナミックロードの例 [Linux only]
tail.c
問題11-1の解答例。 簡単なtailコマンド(出力行数がコマンドライン引数で指定可能)。

第12章

exec.c
exec族のテストコード。
spawn.c
コマンドライン引数で渡されたコマンドを実行する。
dupread.c
dup(2)のテストプログラム。
sh1.c
問題12-2の解答例。 ごく簡単なシェル。
sh2.c
問題12-3の解答例。 パイプとリダイレクトを実装したシェル。

第13章

sig.c
signal(2) のテストプログラム。SIGINT を待つだけ。
sigqueue-test.c
シグナルがキューイングされるかテストするプログラム。 Linux では、プログラムが起動したあとに素早く 5 回 Ctrl-C を打っても (5 回シグナルを送っても) メッセー ジは 2 回しか表示されない。つまり残り 3 つは失われ たということ。
isatty.c
stdin, stdout, stderr のそれぞれについて、 端末かどうか判定する。
trap.c
問題 13-1 の解答例。 SIGINT (Ctrl-C による割り込み) を受けたらメッセージを 出して終了する。

第14章

pwd.c
簡単なpwdコマンド。定数を使う。
pwd2.c
簡単なpwdコマンド。自分でバッファの長さを調節する。
pwd3.c
簡単なpwdコマンド。GNU libc特有のgetcwd()の機能を使う。 [Linux Only]
showenv.c
getenv(3) のテストプログラム。 コマンドライン引数で指定された環境変数の値を表示する。 env.c も参照。
env.c
簡単なenvコマンド。すべての環境変数を表示する。
user.c
コマンドライン引数で指定したユーザのユーザ ID を表示する。 getpwnam(3) の使用例。
id.c
簡単なidコマンド。user.c も参照。
timefmt.c
時刻 API のテストプログラム。
strftime.c
strftime(3) のテストプログラム。
ls2.c
問題14-3の解答例。 簡単なlsコマンド。ファイルのオーナーと最終更新時刻も表示する。

第15章

daytime.c
daytimeクライアント。
daytimed.c
daytimeサーバ。 書籍で書いたのと同じ理由によりIPv4専用。

第16章

httpd.c
本章で作成したお手軽HTTPサーバ。 stdinしか読めない。

第17章

httpd2.c
本章で作成したお手軽HTTPサーバ。 自分でデーモン化とソケット接続が可能。
logging.c
syslog(3)のテストプログラム。

第18章

make/*
makeとMakefileの例