書籍概要

WEB+DB PRESS plus

Linuxシステムコール基本リファレンス
――OSを知る突破口

著者
発売日
更新日

概要

システムコールの基本にスポットを当てた初学者向けのリファレンス。LinuxをはじめとしたUnix系OSにおいて,カーネルとプログラム/プロセスの間に位置するシステムコールはAPIという性質上,互換性を保ちつつ着実に進化する部分で,プログラマにとって長く役立つ技術知識です。本書では,Cライブラリ関数やカーネルとの関係などの基礎の基礎も押さえつつ,64bit版をメインに定番および今どきのシステムコールを厳選収録。Linux/FreeBSD/Solaris互換の実機で試せるサンプルコードを満載し,現場で使える1冊をお届けします。

こんな方におすすめ

  • Unix系OSのシステムコールについて学びたい方
  • サンプルコードを通じてシステムコールの動作を確認してみたい方
  • OSがどのような仕組みで動いているかにご興味のある方

補足

本書で前提とする基礎知識について

本書では,Linux,FreeBSDまたはSolarisを使用し,C言語のコンパイルができる方々を想定し,解説を行っています。

本書の動作確認環境

本書では,以下のそれぞれ64bitと32bit両方で動作確認を行いました。

  • Fedora 27
  • FreeBSD 11.1-RELEASE
  • Solaris 11

上記と異なる環境においては,本書での説明内容や動作等が異なる場合があります。

本書に関するお知らせ

本書に関連する記事を公開しております。

目次

第1章 システムコールの基礎知識

システムコールの実装

  • 「int $0x80」を使ったシステムコール(32bit版Linux)
  • 「sysenter」を使ったシステムコール(32bit版Linux)
  • 「syscall」を使ったシステムコール(64bit版Linux)
  • システムコールに使用されるCPUレジスタ
  • システムコール番号を知る

システムコールとCライブラリ関数

  • Cライブラリ関数を通したシステムコール
  • Cライブラリ関数とシステムコールの関係
  • システムコールの互換性のためのCライブラリ関数

オンラインマニュアルの参照方法

システムコールのエラーチェック

  • エラーコードはerrnoに格納
  • エラーメッセージを一覧表示するサンプルプログラム

第2章 プロセス関連のシステムコール

fork ……新しい子プロセスを作成する

  • forkのサンプルプログラム

execve ……指定したプログラムを実行する

  • 実効ユーザーID,保存ユーザーID等について
  • execveのサンプルプログラム
  • evecveの関連のCライブラリ関数

exit ……プロセスを終了する

  • exitのサンプルプログラム

wait/waitpid/wait3/wait4/waitid ……子プロセスの終了を待つ

  • waitのサンプルプログラム
  • waitpidのサンプルプログラム
  • wait3/wait4のサンプルプログラム
  • waitidのサンプルプログラム

getpid/getppid ……自分または親のプロセスIDを取得する

  • getpid/getppidのサンプルプログラム

chdir/fchdir ……カレントディレクトリを変更する

  • chdir/fchdirのサンプルプログラム

chroot ……ルートディレクトリ(/)を変更する

  • chrootのサンプルプログラム

getpriority/setpriority ……プロセスの優先度を取得/設定する

  • getpriority/setpriorityのサンプルプログラム

getuid/geteuid/getgid/getegid ……プロセスの実ユーザーID/実効ユーザーID/実グループID/実効グループIDを取得する

  • getuid/geteuid/getgid/getegidのサンプルプログラム

setuid/seteuid/setreuid/setgid/setegid/setregid ……プロセスの実ユーザーID/実効ユーザーID/実グループID/実効グループIDを設定する

  • setuidのサンプルプログラム
  • seteuidのサンプルプログラム
  • setreuidのサンプルプログラム
  • setresuid/setresgid/getresuid/getresgidについて

getpgid/setpgid ……プロセスグループIDを取得/設定する

  • getpgid/setpgidのサンプルプログラム
  • getpgrp/setpgrpについて

setsid ……新しいセッションを作成する

  • setsidのサンプルプログラム

getsid ……プロセスのセッションIDを取得する

  • getsidのサンプルプログラム

getgroups/setgroups ……プロセスの補助グループIDを取得/設定する

  • getgroups/setgroupsのサンプルプログラム

getrusage ……システムリソースの使用量を取得する

  • getrusageのサンプルプログラム

getrlimit/setrlimit ……システムリソースの使用量の上限を取得/設定する

  • getrlimit/setrlimitのサンプルプログラム

第3章 ファイル入出力関連のシステムコール

open/openat/creat ……ファイルをオープンする

  • openatシステムコール
  • openatシステムコールの必要性
  • creatシステムコールについて
  • openのサンプルプログラム
  • openatのサンプルプログラム
  • fopen()とopenとの関係

read ……ファイル記述子で指定するファイルを読み込む

  • readのサンプルプログラム

write ……ファイル記述子で指定するファイルに書き込む

  • writeのサンプルプログラム

close ……ファイルをクローズし,ファイル記述子を解放する

  • closeのサンプルプログラム

umask ……ファイル作成時のumask値(modeマスク値)を変更する

  • umaskのサンプルプログラム

lseek ……ファイルの読み書き位置を,指定オフセット位置に移動する

  • lseekのサンプルプログラム

link/linkat ……ファイルのハードリンクを作成する

  • linkのサンプルプログラム
  • linkatのサンプルプログラム

unlink/unlinkat ……ファイルのエントリを削除する

  • unlinkのサンプルプログラム
  • unlinkatのサンプルプログラム

rename/renameat ……ファイル名または場所を変更する

  • renameのサンプルプログラム
  • renameatのサンプルプログラム

mkdir/mkdirat ……ディレクトリを作成する

  • mkdirのサンプルプログラム
  • mkdiratのサンプルプログラム

rmdir ……ディレクトリを削除する

  • rmdirのサンプルプログラム

symlink/symlinkat ……シンボリックリンクを作成する

  • symlinkのサンプルプログラム
  • symlinkatのサンプルプログラム

readlink/readlinkat ……シンボリックリンクの内容を読む

  • readlinkのサンプルプログラム
  • readlinkatのサンプルプログラム

truncate/ftruncate ……ファイルサイズを切り詰める

  • truncate/ftruncateのサンプルプログラム

chmod/fchmod/fchmodat ……ファイルのモード(パーミッション)を変更する

  • chmod/fchmodのサンプルプログラム
  • fchmodatのサンプルプログラム

chown/lchown/fchown/fchownat ……ファイルの所有者とグループを変更する

  • chown/lchown/fchownのサンプルプログラム
  • fchownatのサンプルプログラム

access/faccessat ……実ユーザー/実グループで,ファイルのアクセス権をチェックする

  • accessのサンプルプログラム
  • faccessatのサンプルプログラム

mknod/mknodat ……特殊ファイル,FIFOなどを作成する

  • mknodのサンプルプログラム
  • mknodatのサンプルプログラム

stat/lstat/fstat/fstatat ……ファイルの各種ステータスを取得する

  • stat/lstat/fstatのサンプルプログラム
  • fstatatのサンプルプログラム

utime/utimes ……ファイルの修正時刻とアクセス時刻を変更する

  • utime/utimesのサンプルプログラム
  • lutimes/futimes/futimesatについて

utimensat/futimens ……ファイルの修正時刻とアクセス時刻を変更する(ナノ秒単位)

  • utimensat/futimensのサンプルプログラム

select/pselect ……複数のファイル記述子を同時に監視する

  • selectのサンプルプログラム
  • pselectのサンプルプログラム

poll ……複数のファイル記述子を同時に監視する

  • pollのサンプルプログラム

pipe ……パイプを生成する

  • pipeのサンプルプログラム

dup/dup2 ……ファイル記述子を複製する

  • dup/dup2のサンプルプログラム

fcntl ……ファイル記述子に関する操作を行う

  • F_DUPFDを使ったファイル記述子の複製
  • fcntl(F_DUPFD)のサンプルプログラム
  • F_SETLKWを使ったファイルのロック
  • fcntl(F_SETLKW)のサンプルプログラム

ioctl ……デバイスの制御を行う

  • ioctlでIPアドレスを取得するサンプルプログラム
  • ioctlで端末のウィンドウサイズを取得するサンプルプログラム

flock ……同一ホスト内でファイルをロックする

  • flockのサンプルプログラム

getdents ……ディレクトリのエントリを取得する

  • getdentsのサンプルプログラム
  • readdir()のサンプルプログラム

statvfs/fstatvfs ……ファイルシステムの情報を取得する

  • statvfs/fstatvfsのサンプルプログラム

getdtablesize ……オープンできるファイル数の最大値を取得する

  • getdtablesizeのサンプルプログラム

sync ……更新されたバッファキャッシュをディスクに書き込む

  • syncのサンプルプログラム

fsync ……ファイル記述子を指定してsyncを行う

  • fsyncのサンプルプログラム

readv/writev ……複数のバッファを使ってファイルを読み書きする

  • readv/writevのサンプルプログラム

pread/pwrite ……オフセットを指定してファイルを読み書きする

  • pread/pwriteのサンプルプログラム

第4章 メモリ関連のシステムコール

mmap/munmap ……ファイルをメモリにマップ/マップ解除する

  • mmap/munmapのサンプルプログラム

mprotect ……メモリのアクセス保護を変更する

  • mprotectのサンプルプログラム

brk/sbrk ……ヒープ領域にメモリを動的に割り当て,または解放する

  • brk/sbrkのサンプルプログラム

getpagesize ……システムのページサイズを取得する

  • getpagesizeのサンプルプログラム

第5章 シグナル関連のシステムコール

kill ……シグナルを送信する

  • killのサンプルプログラム

sigaction ……シグナル受信時の動作を設定する

  • sigactionのサンプルプログラム

signal ……シグナル受信時の動作を設定する(従来方式)

  • signalのサンプルプログラム

sigprocmask ……シグナルマスクを変更する

  • sigprocmaskのサンプルプログラム

sigsuspend ……一時的にシグナルマスクを変更し,シグナルの到着を待つ

  • sigsuspendのサンプルプログラム

sigpending ……ブロックされ保留中のシグナルがあるかどうか調べる

  • sigpendingのサンプルプログラム

sigwaitinfo/sigtimedwait ……ブロックしたままシグナルの到着を待つ

  • sigwaitinfoのサンプルプログラム
  • sigtimedwaitのサンプルプログラム

getitimer/setitimer ……インターバルタイマーの値を取得/設定する

  • getitimer/setitimerのサンプルプログラム

timer_create/timer_settime/timer_gettime/timer_delete ……新型インターバルタイマーの設定/取得をする

  • timer_create/timer_settime/timer_gettime/timer_deleterのサンプルプログラム

第6章 時刻関連のシステムコール

gettimeofday/settimeofday ……時刻をマイクロ秒単位で取得/設定する

  • gettimeofday/settimeofdayのサンプルプログラム

time/stime ……時刻を秒単位で取得/設定する

  • time/stimeのサンプルプログラム

clock_gettime/

clock_settime/clock_getres ……時刻をナノ秒単位で取得/設定する

  • clock_gettime/clock_gettime/clock_getresのサンプルプログラム

nanosleep ……ナノ秒単位でプロセスを停止する

  • nanosleepのサンプルプログラム

第7章 システム属性関連のシステムコール

uname ……各種システム情報を取得する

  • unameのサンプルプログラム

gethostname/sethostname ……ホスト名を取得/設定する

  • gethostname/sethostnameのサンプルプログラム

getdomainname/setdomainname ……NISドメイン名を取得/設定する

  • getdomainname/setdomainnameのサンプルプログラム

第8章 ネットワーク(ソケット)関連のシステムコール

socket ……通信のためのソケットを作成する

  • socketのサンプルプログラム

bind ……ソケットにソケットアドレスを割り当てる

  • bindのサンプルプログラム

listen ……接続型ソケットを接続待ち状態にする

  • listenのサンプルプログラム

accept ……接続型ソケットへの接続を受け付ける

  • acceptのサンプルプログラム

connect ……ソケットに接続する

  • サンプルプログラム

recvfrom ……ソケットからデータを受信する

  • recvfromのサンプルプログラム

sendto ……ソケットにデータを送信する

  • sendtoのサンプルプログラム

getsockopt/setsockopt ……ソケットのオプションを取得/設定する

  • getsockopt/setsockoptのサンプルプログラム

shutdown ……接続中のソケットの通信を遮断する

  • shutdownのサンプルプログラム

getpeername/getsockname ……接続先または自分のソケットアドレスを取得する

  • getpeername/getsocknameのサンプルプログラム

第9章 間接システムコール

syscall ……間接的にシステムコールを行う

  • syscallのサンプルプログラム

socketcall ……ソケット関連のシステムコールを呼び出す[Linux特有]

  • socketcallのサンプルプログラム

第10章 [システムコールで作る]簡易版UNIXコマンド

簡易echoコマンドの作成

簡易catコマンドの作成

簡易catコマンドの改良

簡易cpコマンドの作成

簡易cp -pコマンドの作成

簡易lnコマンドの作成

簡易mkdirコマンドの作成

簡易rm/rmdirコマンドの作成

簡易touchコマンドの作成

簡易whoamiコマンドの作成

簡易sleepコマンドの作成[nanosleep版]

簡易sleepコマンドの作成[select版]

簡易niceコマンドの作成

簡易timeコマンドの作成

簡易unameコマンドの作成

簡易netcatコマンドの作成

サポート

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2018年6月14日最終更新)

P.106 リストA内 下から4行め

    raveturn 1;
    return 1;

P.246 下から6行めおよび8行め (電子版では修正済み)

clock_gettime/clock_gettimeは
clock_gettime/clock_settimeは

P.247 ページ内上方の見出し (電子版では修正済み)

clock_gettime/clock_gettime/clock_getresのサンプルプログラム
clock_gettime/clock_settime/clock_getresのサンプルプログラム

P.247 本文1行め (電子版では修正済み)

リストAとリストBはclock_gettime/clock_gettimeの
リストAとリストBはclock_gettime/clock_settimeの

ダウンロード

本書に掲載しているサンプルプログラムを公開しています。以下の圧縮ファイル形式(ZIP)をダウンロード後に適宜解凍してご利用ください。

(2023年1月4日更新)

ダウンロード
サンプルファイル(Linuxsyscallrefbook.zip)

商品一覧