UNIX上において実行されている状態のプログラムのことをプロセスと言う。
プロセスにはその時点で独自のプロセス番号が割り当てられる。
そして、すべてのプロセスはプロセスは番号が1のプロセス(init)を祖先として、その子孫として作られてゆく。
(ちょうどディレクトリがルートディレクトリ( / )を元として作られているのと同じ形である)
UNIXではユーザーが自分で実行していないプロセスがたくさん実行されている。
それらはUNIXのシステムのために実行されているプロセスである。
以下のプログラムをtest.cという名前で作り、コンパイルしておく。
main()
{
while(1)
{
sleep(10);
}
}
ジョブコントロールとは フォアグラウンドとバックグラウンドを切替える機能のことである。
普通、コマンドはフォアグラウンドで実行される。
だが、コマンド起動時に&(アンパサンド)をつけて実行するとバックグラウンドで実行できる。
(フォアグラウンドで実行されているコマンドもCtrl+zによってバックグラウンドで実行できる)
そうしておくと、同じコンソールで他のコマンドを同時に実行できるので便利である。
以下のコマンド( Ctrl+z, fg, bg )を使用すると何度でもフォアグラウンドとバックグラウンドを切替えて実行することができる。
# a.out & <- a.outをバックグラウンドで実行 # jobs [1] - Running a.out <- a.outがバックグラウンドで実行中(ジョブ番号は 1 ) # fg <- a.outをフォアグラウンドで実行 a.out Ctrl+z <- a.outを一時的に停止 Suspended # jobs [1] - Stopped a.out <- a.outがバックグラウンドで停止中 # bg <- 再びa.outをバックグラウンドで実行 [1] a.out & # jobs [1] - Running a.out <- 再びa.outがバックグラウンドで実行中 # kill %1 <- a.outの実行を中止 # jobs <- バックグラウンドで実行中のジョブは無い #
バックグラウンドでコマンドを実行させると、そのコマンドから標準出力・標準エラー出力に出力されるデータはそのまま現在のターミナルに出力されてしまう。
だからフォアグラウンドで vi などを使用していると画面が乱れてしまう。
このような時には、実行する時に出力をリダイレクションなどでファイルに書きこむ様にしておくとよい。
# a.out > data & <- a.outの出力をdataに書き込みながらバックグラウンドで実行
# a.out & <- a.outをバックグラウンドで実行 # ps <- このコンソールで自分が実行しているプロセスだけ表示 PID TT STAT TIME COMMAND 12782 p0 S 0:00 -tcsh 24129 p1 S 0:00 a.out 24135 p1 R 0:00 ps <- a.outのプロセス番号は24135 # ps -ef <- このマシンで実行されているすべてのプロセスを表示 USER PID %CPU %MEM VSZ RSS TT STAT START TIME COMMAND abe 12177 0.0 0.5 1544 180 1 S May 19 0:00 jtcsh abe 12767 0.0 0.2 1548 64 1 S 05:11 0:00 startx abe 24129 0.0 0.3 1944 120 p1 R 05:11 0:00 a.out . . . . . . . . . . . . . . . . <- 長いので途中は省略 . . . . . . . . . . . root 12568 0.0 0.1 812 40 2 S 00:18 0:00 getty root 12775 0.0 2.6 2704 828 1 S 05:11 0:01 xterm -geometry 89x root 12776 0.0 3.4 2808 1068 1 S 05:11 0:12 kterm -km euc -geom # ps -ef | grep a.out <- a.outが含まれるプロセスだけを表示 abe 24129 0.0 0.3 1944 120 p1 R 05:11 0:00 a.out # kill 24129 <- a.outを中止させる # ps PID TT STAT TIME COMMAND 12782 p0 S 0:00 -tcsh 24146 p1 R 0:00 ps