システムコール

callname.txt/usr/include/asm/unistd.h のシステムコールのリスト。システムコールの使い方は man 2 open のようにマニュアルページのセクション 2 で見ることができます。
exit.cexit - No.1 はプロセスを終了させます。
fork.cfork - No.2は自分自身のコピーを子プロセスとして走らせます。fork() 以下の命令が実行されます。fork.c を走らせると PID(プロセスID)のちがう親子のプログラムが併行して同じことをやっているのが分かります。
syscat.cread - No.3 と write - No.4 はファイルの読みかきをします。
open.copen - No.5 と close- No.6 はファイルのオープンとクローズをします。
wait.cwait - No.7 は子プロセスが終了するのを待って親プロセスの次の命令に移ります。fork.c の動作と比較してみてください。
creat.ccreat - No.8 はファイルが存在しない場合はあたらしいファイルを作成してオープンします。
link.clink - No.9 はファイルのハードリンクを作成します。シェルコマンドの ln のような動作をします。
unlink.cunlink - No.10 はファイルの削除を行います。シェルコマンドの rm のような動作をします。
envs.cmain() の第3引数には、環境変数の配列が渡されます。システムコール execve の第3引数にも環境変数のリストを渡します。
execve.cexecve - No.11 は現在のプロセスを終了して、他のプログラムを実行します。
chdir.cchdir - No.12 はカレントワーキングディレクトリを変更します。cd のようなものです。
time.ctime - No.13 は現在の時刻を秒単位で取得します。
mknod.cmknod - No.14 は特殊ファイルを作成します。サンプルプログラムは "foo" という名前の FIFO(名前つきパイプ)を作成します。echo hello > foo でコンソールがサスペンドしますが、別の kterm を開いて cat foo とすると hello が表示され、もとのコンソールのサスペンドも解除されます。mknod の第3引数はデバイスのメジャー番号とマイナー番号です。デバイス番号は ls -l /dev/hda のようにするとそのデバイスファイルのデバイス番号を知ることができます。Linux のデバイスリストはLANANA Linux Device Listで見ることができます。
chmod.cchomod - No.15 はファイルのパーミッションを変更します。サンプルプログラムはコンパイルした後 ./a.out foo 755 のようにするとファイル foo のパーミッションを変更できます。
lchown.clchown - No.16 はファイルのオーナーとグループを変更します。サンプルをコンパイルした後、su でスーパーユーザになって ./a.out foo を実行すると foo のユーザとグループが root になります。ユーザの uid と gid は /etc/passwd の第 3 フィールドと第 4 フィールドです。
breakbreak - No.17 は Linux では使われていません。
oldstatoldstat - No.18 は互換性のためだけにのこされていますが Linux では使われません
lseek.clseek - No.19 は file offset (ファイルからバッファーに文字を読みこむ位置)の変更を行います。サンプルプログラムをコンパイルして ./a.out foo n とするとファイル foo の n 番目の文字が表示されます。
getpid.cgetpid - No.20 は自分のプロセスID を取得します。getppid は親プロセスのプロセスIDを取得します。
mount.cmount - No.21, umount - No.22 はファイルシステムのマウントとマウントの解除を行います。サンプルプログラムはスーパーユーザで実行してください。
setuid.csetuid - No.23 はプロセスのユーザIDを変更します。サンプルプログラムはスーパユーザでコンパイルしてスーパユーザで試してください。./a.out で /etc/shadow の内容を表示できます。./a.out s とsオプションをつけるとプロセスの uid が一般ユーザになるのでエラーになります。
getuid.cgetuid - No.24 はプロセスの実ユーザIDを返します。
stime.cstime - No.25 は時刻の設定をします。サンプルプログラムはスーパーユーザでコンパイルして実行してください。
ptrace.cptrace - No.26 はデバッグのためのシステムコールです。サンプルプログラムは LinuxGazette に投稿された Sandeep S さんの Process Tracing Using Ptrace からの引用です
alarm.calarm - No.27 を実行すると引数で指定した秒数後に SIGALRM シグナルをそのプロセスに対して発生させます。signal システムコールでシグナルハンドラーを登録しておくと SIGALRM をトラップして処理することができます。
oldfstatoldfstat - No.28 は互換性のためだけにのこされていますが Linux では使われません
pause.cpause - No.29 はプロセスを止めてシグナルの発生を待ちます。
utime.cutime - No.30 はファイル属性のアクセス時間と変更時間を変更します。サンプルプログラムをコンパイルした後、touch foo でテスト用のファイルを作成します。stat foo で access time と modification time を見ておきます。次に ./a.out foo を実行して再び stat foo を行うと両者が10分進んでいます。
sttystty - No.31 と gtty - No.32 は Linux では実装されていません。
access.caccess - No.33 はファイルのパーミッションをチェックします。サンプルプログラムをコンパイルした後 ./a.out foo を実行すると、ファイル foo が実行可能かどうかチェックします。
nice.cnice - No.34 はプロセスの優先順位を変更します。サンプルプログラムは何も出力しません。
ftimeftime - No.35 は使われていません。代わりに time(2)、gettimeofday(2)、clock_gettime(3) が使われるそうです。
sync.csync - No.36 はメモリー上のバッファの内容を全てファイルにかきこみます。fsck, df, reboot などに使われているそうです。サンプルプログラムは何も出力しません。
kill.ckill - No.37 はプロセスにシグナルを送ります。
rename.crename - No.38 はファイルの名前の変更や移動を行います。シェルコマンドの mv と同じです。サンプルプログラムをコンパイルして ./a.out foo bar とするとファイル名を foo から bar に変更できます。
mkdir.cmkdir - No.39 は新しいディレクトリを作成します。サンプルプログラムをコンパイルした後 ./a.out foo とするとディレクトリ foo が作成されます。
rmdir.crmdir - No.40 は空のディレクトリを削除します。サンプルプログラムをコンパイルした後 ./a.out foo とするとディレクトリ foo が削除されます。
dup.cdup - No.41 はファイルディスクリプタの複製をします。
pipe.cpipe - No.42 はパイプをオープンし入力用のファイルディスクリプタと出力用のそれを作成します。pipe のプログラミングについての解説はhttp://www.linuxhq.com/guides/LPG/node11.htmlhttp://www.wakhok.ac.jp/~maruyama/Syscall/pipe/section3.3.html
times.ctimes - No.43 はプロセスに要した時間を計測するのに利用されます。
profprof - No.44 はリナックスでは実装されていません。
brk.cbrk - No.45 はヒープ領域を拡げるときに利用されます。
memory.cbrk 関連のサンプルプログラム。プロセスの各変数のメモリ配置を表示します。
setgid.csetgid - No.46 はプロセスのグループID を変更します。サンプルプログラムをコンパイルした後、一般ユーザで ./a.out を実行してもプロセスの gid は変更されません。su でスーパーユーザになって実行すると gid = 7 に変更されます。setgid はプロセスを実行したユーザのアクセス権限に影響されるからです。
getgid.cgetgid - No.47 はプロセスの実グループのIDを取得します。サンプルプログラムは一般ユーザでコンパイルした後 chmod +s a.out で a.out のスティッキービットを立てます。次に su でスーパーユーザになって ./a.out を実行します。
signal.csignal - No.48 はシグナルハンドラー(シグナルが発生したときに処理をする関数)をシグナルハンドラーテーブルに登録します。
geteuid.cgeteuid - No.49 はプロセスの実効ユーザIDを、getegid - No.50 はプロセスの実効グループIDを取得します。プロセスの実効ユーザはファイルのオーナーで、実ユーザはプロセスを呼び出したユーザです。サンプルプログラムを gcc geteuid.c でコンパイルした後、chmod +s a.out で sticky bit を立てます。次に su でスーパユーザになって ./a.out を実行すると a.out の実ユーザと実効ユーザが表示されます。
acct.cacct - No.51 はカーネルのプロセスアカウンティングの on と off を指示します。プロセスアカウンティングの情報は非常にファイルサイズが大きくなるため普通は使いません。acct(filename) を実行するとカーネルはプロセスアカウンティングの情報を filename で指定されたファイルにかきこみます。acct(NULL) でプロセスアカウンティングは解除されます。acct を利用するプロセスのユーザはスーパーユーザでなくてはいけません。サンプルプログラムは gcc acct.c でコンパイルした後、touch /var/tmp/test_acct でプロセスアカウントを保存するファイルを作成します。次に su でスーパーユーザになって ./a.out on を実行するとプロセスアカウンティングが on になります。test_acct はバイナリーファイルなので cat や less では読めません。strings /var/tmp/test_acct で実行されたプロセス名を参照できます。プロセスアカウンティングが作動しているのを確かめたら, ./a.out off でプロセスアカウンティングを中止し、rm /var/tmp/test_acct でファイルを削除しておきます。
umount2umount2 - No.52 はマニュアルページがありませんでした。
locklock - No.53 は Linux では実装されていません。
ioctl.cioctl - No.54 はデバイスドライバーを制御します。サンプルプログラムは kterm の端末情報を取得してエコーバックを抑制します。このサンプルプログラムは terminal emulator のデバイスファイルの /dev/pts/0 を使うので実行するときは kterm などの terminal emulator はひとつだけにしてください。参照:TERMIOS
fcntl.cfcntl - No.55 はファイルディスクリプタの情報を操作します。サンプルプログラムはファイルディスクリプタのフラグを取得してビット型式で表示します。fcntl は SCSI のデバイスファイルを non blocing io としてスキャンしておいて BUSY が解消したら、blocking io に切り替えて通信するというような使い方をするようです。
mpxmpx - No.56 は Linux では実装されていません。
setpgidsetpgid - No.57 はプロセスのグループID を変更します。サンプルプログラムは省略します。
ulimitulimit - No.58 は glibc の include file にも載っていません。代わりに getrlimit, setrlimit, sysconf が使われるようです。
oldoldunameoldolduname - No.59 は古いシステムコールで Linux では使われません。
umask.cumask - No.60 は新規ファイルのパーミッションのデフォールトを指定する umask の値を設定します。'help umask'、'umask -S'、'umask -p'、'man 2 umask' などを参照してください。
chroot.txtchroot - No.61 は root ディレクトリーを他のディレクトリーに移動させるシステムコールです。chroot でルートディレクトリーを移動して bind や ftp などのネットワークプログラムをこの chroot jail の中で動作させるようにして、セキュリティーが破られても、侵入者が chroot jail 以外のディレクトリーにアクセスできないようにします。サンプルプログラムはありません。
ustat.custat - No.62 はファイルシステムの情報を取得するシステムコールです。このシステムコールは互換性のためのもので、新しいプログラムは statfs(2) を使用します。
dup2.cdup2 - No.63 はファイルディスクリプターのコピーを行います。プログラムでパイプやリダイレクトを利用するときに使います。サンプルプログラムは ls > foo.txt と同じ動作になります。
getppid.cgetppid - No.64 は現在のプロセスの親プロセスのプロセスIDを取得します。
getpgrp.cgetpgrp - No.65 は現在のプロセスの process group ID を取得します。