ふつうのLinuxプログラミング第2版ソースコード
Switch branches/tags
Nothing to show
Clone or download
Latest commit d1be9e6 Sep 12, 2017
Permalink
Failed to load latest commit information.
gdb import initial source Sep 9, 2017
link import initial source Sep 9, 2017
make import initial source Sep 9, 2017
shlib import initial source Sep 9, 2017
.gitignore new program: mkpath Sep 10, 2017
LICENSES add tmp README and license Sep 9, 2017
Makefile wrote README Sep 12, 2017
README.md fix HTML tag Sep 12, 2017
args.c import initial source Sep 9, 2017
array.c remove ReVIEW preproc tag Sep 9, 2017
bell.c import initial source Sep 9, 2017
cat-escape.c use C99 style Sep 12, 2017
cat.c import initial source Sep 9, 2017
cat0.c import initial source Sep 9, 2017
cat2.c import initial source Sep 9, 2017
cat3.c remove ReVIEW preproc tag Sep 9, 2017
cat4.c remove ReVIEW preproc tag Sep 9, 2017
cat5.c use C99 style Sep 12, 2017
catdir.c import initial source Sep 9, 2017
chgrp.c import initial source Sep 9, 2017
chmod.c import initial source Sep 9, 2017
chown.c import initial source Sep 9, 2017
data fix test script Sep 12, 2017
data.esc fix test script Sep 12, 2017
data.esc0 fix test script Sep 12, 2017
daytime.c remove ReVIEW preproc tag Sep 9, 2017
daytimed.c remove ReVIEW preproc tag Sep 9, 2017
dupread.c import initial source Sep 9, 2017
echo.c import initial source Sep 9, 2017
echoclient.c use C99 style Sep 12, 2017
env.c import initial source Sep 9, 2017
exec.c import initial source Sep 9, 2017
feof-bug.c import initial source Sep 9, 2017
getcperf.c import initial source Sep 9, 2017
grep.c remove ReVIEW preproc tag Sep 9, 2017
grep2.c use C99 style Sep 12, 2017
grep3.c remove ReVIEW preproc tag Sep 9, 2017
head.c remove ReVIEW preproc tag Sep 9, 2017
head2.c remove ReVIEW preproc tag Sep 9, 2017
head3.c remove ReVIEW preproc tag Sep 9, 2017
head4.c remove ReVIEW preproc tag Sep 9, 2017
hello.c import initial source Sep 9, 2017
httpd.c remove ReVIEW preproc tag Sep 9, 2017
httpd2.c remove ReVIEW preproc tag Sep 9, 2017
id.c import initial source Sep 9, 2017
isatty.c import initial source Sep 9, 2017
ln.c import initial source Sep 9, 2017
logging.c import initial source Sep 9, 2017
ls.c import initial source Sep 9, 2017
ls2.c new command ls2: simple ls with detailed output Sep 10, 2017
mapwrite.c import initial source Sep 9, 2017
mkdir.c import initial source Sep 9, 2017
mkpath.c new program: mkpath Sep 10, 2017
mv.c import initial source Sep 9, 2017
pwd.c import initial source Sep 9, 2017
pwd2.c remove ReVIEW preproc tag Sep 9, 2017
pwd3.c import initial source Sep 9, 2017
rm.c import initial source Sep 9, 2017
rmdir.c import initial source Sep 9, 2017
segv.c import initial source Sep 9, 2017
sh1.c import initial source Sep 9, 2017
sh2.c import initial source Sep 9, 2017
showenv.c import initial source Sep 9, 2017
sig.c import initial source Sep 9, 2017
sigqueue-test.c import initial source Sep 9, 2017
slice.c import initial source Sep 9, 2017
slice2.c import initial source Sep 9, 2017
spawn.c remove ReVIEW preproc tag Sep 9, 2017
stat.c import initial source Sep 9, 2017
strftime.c import initial source Sep 9, 2017
symlink.c import initial source Sep 9, 2017
tail.c use C99 style Sep 12, 2017
tail2.c tail.c -> tail2.c Sep 9, 2017
test-scripts.sh fix test script Sep 12, 2017
timefmt.c import initial source Sep 9, 2017
touch.c import initial source Sep 9, 2017
trap.c remove ReVIEW preproc tag Sep 9, 2017
traverse.c import initial source Sep 9, 2017
user.c import initial source Sep 9, 2017
wc-l-stdio.c rename wcl.c -> wc-l-stdio.c Sep 10, 2017
wc-l-syscall.c use C99 style Sep 12, 2017
wgrep.c import initial source Sep 9, 2017

README.md

『ふつうの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の例