コマンド - みる会図書館


検索対象: BSD magazine No.3 BSDではじめよう! ; BSD日本語環境構築術
56件見つかりました。

1. BSD magazine No.3 BSDではじめよう! ; BSD日本語環境構築術

簇 2 - プ回クラミンクをはしめよう ! (gdb) break main Breakpoint 1 at 0X80484 土 e : file HELLO. c , line 8 . (gdb) 図 10 main 関数にプレークホイントを設定する Breakpoint 1 , main ( ) at HELLO. c : 8 Starting program : /home/hanai/playground/a. out (gdb) run 8 (gdb) (gdb) step (gdb) p s ( gdb ) 13 (gdb) s 16 main ( ) (gdb) s ( gdb ) 12 char s ロ " 五 e110 , world" run コマンドを用いてプログラムを実行する 図 11 1 (gdb) p s $ 1 = " e110 , ( gdb ) 図 13 world" 変数 s の値を表示する 図 12 s p を入力する memset (p, at HELLO . C:16 1 , q) ; for (i = 0 ; i く strlen(s); + + i ) { 図 14 memset の実行直後 プロンプトである。つまり、これ以降 はシェルではなくデバッガと対話する のだ。デバッガを用いればプログラム を最初から 1 行ずっ実行することがで き、またその都度変数の値を調べるこ とができる。デバッガを起動した段階 ではプログラムの実行は始まっていな $ 2 = ー \ 00 餐く repeats 13 times> (gdb) 図 15 変数 s の内容を表示する いのだが、 こで実行を開始してしま うと最後まで行ってしまうため、まず 実行した途端に停止することにする。 そのために用いるのが break コマンドで ある。 break コマンドは引数として関数 名やソースコード中での行数を受け取 り、そこにプレークポイントを設定す る。デバッガの中でプログラムが実行 されているとき、プレークポイントが あればそこで一停止し、ユーザーの は gdb の print コマンドの省略形である。 値を表示することができる。 p というの めだ。 こで、図 1 3 のように変数 s の に 12 行目が 2 つ目のステップであるた は変数の宣言文や空行しかなく実質的 停止した。これは、 8 行目と 12 行目に 押す ( 図 12 ) 。今度は 12 行目の手前で 進めるために step と入力し enter キーを の手前で停止している。こで、 1 行 ラムは main 関数の最初の行 ( 8 行目 ) ークポイントを設定したため、プログ ラムの実行を開始する ( 図 1 1 ) 。プレ ここで、 run コマンドを用いてプログ ークポイントを設定すればよい ( 図 ぐに停止するためには main 関数にプレ るため、プログラムが走り始めたらす グラムは main 関数の先頭から実行され アクションを待つのである。通常プロ gdb では、よく用いる print や step 、 break といったコマンドに対しては省略 形 ( それぞれの頭文字であることが多 い ) が用意されている。また、コマン ドの省略形がない場合でも、コマンド 名をすべてタイプしなくても識別でき るぶんだけ入力してやればよいように なっている。また、単に enter だけ入力 した場合には直前のコマンドが実行さ れるようになっているため、一度 s (step の省略形 ) を入力し、しばらく 1 行すっ実行したい場合には enter キーを 叩くだけでよい。 step コマンドをしばらく続けて、 memset (), 1 , q) を参考に、腕を磨いていただきたい。 な手順である。 gdb の info や書籍 [ 2 ] したのは基本中の基本とも言えるよう 細かい調査が可能になる。こて紹介 ば、 printf デバッグではできないような このようにデバッガの助けを借りれ たのである。 ものとは異なる状態に陥いってしまっ 入れてしまったのだ。そのため望んだ 列の先頭から q バイト分に 1 という値を と間違ってしまったため、 p カ嗟す文字 数と第 3 引数の順序を うものだ。ところが上の例では第 2 引 から len バイト分を c の値で埋めるとい アルより ) 。 b で示される文字列の先頭 は図 1 6 のとおりだ ( オンラインマニュ しまったのだ。 memeset 関数の使い方 ってこのようにおかしな状態にされて された配列なのだが、 memset 関数によ は「 hello, world 」という文字列が格納 かしな状態になっている。もともと、 s 示してみると、図 15 のように非常にお たい ( 図 14 ) 。 こで変数 s の内容を表 memset の実行直後で止まっていただき BSD magazine 2000 No. 3 57

2. BSD magazine No.3 BSDではじめよう! ; BSD日本語環境構築術

$ whereis CC cc : /usr/bin/cc /usr/share/man/manl/cc. 1 ・ gz /usr/src/gnu/usr. bin/cc $ ls 図 4 whereis コマンドで調べる cc e110. c a . out he110. c 図 5 he Ⅱ 0. c のコンバイル ル系では which を使う ( 図 3 ) 。 べるには、 B シェル系では type 、 C シェ あるコマンドが存在するかどうかを調 コマンドがあるかどうか調べてみよう。 名は cc である。ますは手元の BSD で cc ステムでは、 C のコンパイラのコマンド はすべて GNU のものである。多くのシ イラ / リンカ、後で述べるデバッガなど さて、 BSD に標準で附属するコンパ また、 whereis コマンドを用いればコ マンド自体の在処の他にマニュアルフ ァイルやソースコードの在処まで探し てくれる ( 図 4 ) 。 の環境変数 PATH にん sr / bin が含まれて いることを確認しよう。もしかすると cc ではなく gcc という名前かもしれない ので、 gcc というコマンドについても調 べてみていただきたい。それでも見つ からない場合は、インストールが成功 していないことも考えられるので、場 合によってはもう一度インストールを やり直す必要があるだろう。 $ cc —v he110. c Using builtin specs . 1 3 5 6 7 8 11 13 15 17 5 イ 2 gcc version 2.95.2 19991024 (release) /usr/libexec/cpp —lang—c —v —D——GNUC——=2 —D——GNUC—MINOR——=95 ー Di386 \ —Dunix —D__FreeBSD__=4 —D__FreeBSD_cc_version=400004 ー D ーー i386 ー —D__FreeBSD__=4 —D__FreeBSD_cc_version=400004 ー D ーー i386 \ —D_ _uni X_ —D——unix —Acpu(i386) —Amachine ( i386 ) —Asystem(unix) —Asystem(FreeBSD) 4 GNU CPP version 2 . 95 . 2 19991024 (release) ( i386 FreeBSD/ELF) he110. c /tmp/ccB60718. i —Acpu(i386) —Amachine ( i386 ) ー Di386 ー D ーー i386 ー D ーー i386 ー #include search starts here : #include く . . > search starts here: /usr/include /usr/include 9 End of search list . 10 The following default directories /usr/include/g + + 12 End of omitted list . /usr/libexec/ccl /tmp/ccB60718. i ー 0 / tmp / CC160718. s have been omitted from the search path : -quiet -dumpbase he110 . C —verslon 14 GNU C version 2 . 95 . 2 19991024 (release) (i386-unknown-freebsd) \ compiled by GNU C version 2.95.2 19991024 (release) . /usr/libexec/elf/as —v ー 0 /tmp/ccq60718.0 / tmp / CC160718. s 16 GNU assembler version 2 . 9 . 1 (i386—unknown—freebsdeIf) , \ using BFD version 2 . 9 . 1 /usr/libexec/elf/ld —m elf ー i386 —dynamic—linker \ /usr/lib/crtbegin ・ 0 —L/usr/1ibexec/e1f —L/usr/Iibexec —L/usr/Iib \ /usr/libexec/ld—elf . so . 1 /usr/lib/crtl . 0 /usr/lib/crti . 0 \ BSD magazine 2000 NO. 3 図 6 - v オプションをつけて hello. c をコンバイルする ( 3 , 13 , 14 , 16 , 17 行では一行が長いので行末に \ を付けて折り返した ) /usr/lib/crtend. 0 /usr/lib/crtn. 0 / tmp / CCq60718.0 /usr/lib/libgcc . a -lc /usr/lib/libgcc. a さて、 cc コマンドがあることがわか ったら、 hello. c をコンパイル / リンクし he110 , world $ . /a. out ます上で行った cc に he Ⅱ。 . c を与えて りのことも押さえておく必要がある。 ラミングの仕組みを知るにはそのあた が水面下でなされていたのだ。プログ が、実はその間に実にさまざまなこと いう 2 つのステップで到着してしまった こまでは cc コマンドと a. out の実行と さて、ソースコードを編集してから きたい。 ソースコードを慎重に見直していただ なかったらどこかに問題があるはずだ。 か ? もし「 hello,world 」が出力され プログラムはうまく動いただろう ファイルなのだ。まずは実行してみよ ァイルが、最終的に得られるべき実行 ているはずである。この a. out というフ 了し、 a. out というファイルが作成され 特になにも言われずにコマンドは終 てみる ( 図 5 ) 。 だ。上の実行例をこれに当てはめて見 してリンクという 4 つの段階があるの ロセス、コンパイル、アセンプル、そ まかな流れだ。この過程には、プリプ (hello. c) →実行ファイル (). out) の大 れておくべきことは、ソースコード この過程を理解するためにまず頭に入 が実行されていることがわかると思う。 されたのだが、実は非常に多くの処理 与えただけで実行ファイル a. 。 ut が作成 cc コマンドに he Ⅱ 0. c を このように current である ) 。 したのは 2 月 16 日あたりの FreeB SD ョンを与えてやってみる ( ここで使用 見るために、図 6 のように cc に - v オプシ a. 。 ut が作成されるまでの過程の詳細を

3. BSD magazine No.3 BSDではじめよう! ; BSD日本語環境構築術

2 プ回クラミクをはしめよう ! 1.1 版となっている。 作成し、そのディレクトリを add してい 行すること。今日の日付が 2000 年 2 月 9 る。こうすることで、そのディレクト import コマンドの場合は、 import を 日なら日付を表すタグを用いて、 実行したディレクトリとその下に存在 リ名でリポジトリが作成されることに するすべてのファイルが登録される。 なる。すなわち、 $CVSROOT/exampIe2 % cvs tag SNAP ー 000209 が作成される。あとは ( 7 ) と同様に ところが、 add だとすべてのファイルや ディレクトリを指定する必要がある。 各ファイルを add していけばよい。 を実行することで、現在の時点のスナ 次のようにⅱ nd と xargs コマンドを使 ップショットのソースを表すタグとす 9 タグの設定 えば、すべてのファイルを登録するこ ることができる。 タグは、リリースを表す目的やスナ とができる。 また、リリース用のタグを設定する ップショットに付けるために使用され 場合は、 る。 import サプコマンドでは、べンダ ータグ、リリースタグを指定したが、 % cvs tag REL—OI これらはいずれも同じものである。 タグを設定するには、 tag サプコマン とかになるであろう。タグを設定する ドを使用する。このコマンドは、チェ コマンドには、もう 1 つ rtag がある。 ックアウトを行ったディレクトリで実 れはリポジトリ ( 書庫 ) を指定してタ % find —print ー xargs cvs add ただし、ファイルが多い場合は時間 がかかったりうまく実行できないかも しれない。ファイル数が 100 個程度な らだいじようぶだと思われる。ファイ ル数が多い場合は、 1 ファイル毎に cvs add を行う次のコマンドを使うとよいだ ろう。上記の通り実行すると、図 1 2 の ように表示される。これは、 . ディレク トリを登録しようとするためである。 これを避けるためには、図 13 のように して . を除けばよい。 8 リビジョン番号 1 .1 から始めるた めの登録 ( その 2 ) cvs 使いのべテランなら、 ( 7 ) の方法 は面倒だと思われるだろう。そこで、 もうひとつの方法を紹介する。 % mkdir &/work % cd &/work cvs checkout ー 1 % mkdir examp12 % cvs add examp12 % cd examp12 % cvs add example. c skipping cvs add : cannot add special file 図 12 find . -printl xargs cvs add の実行結果 % find —name -print ー xargs cvs add 図 1 3 を取り除く % cvs checkout —r SNAP ー 000209 exampl % cvs checkout —r REL—OI exampl % cvs export ーて SNAP ー 000209 exampl % cvs export —r REL—OI exampl 図 14 タグを指定してソースを復元する 図 15 expo 杙コマンドを使用する % cvs rtag —b —r REL—OI REL—OI—FIX exampl 図 16 ag コマンドを使用する % ls —FC -/cvsroot/exampl Attic/ Makefi1e,v % ls -/cvsroot/examp1/Attic NEWF ILE , v 図 17 add サプコマンドによって Attic ディレクトリに入れられる example . c,v % cvs diff example. c lndex : example . c RCS file : /usr/home/kogane/cvsroot/exampl/example. c,v retrieving て eVIS10 Ⅱ 1 . 2 diff —rl . 2 example . c 13a14 cvs checkout -1 . は、 $CVSROOT のデ ィレクトリだけをチェックアウトしてい る、 -1 オプションは $CVSROOT 以下の ディレクトリやファイルをリカーシプに チェックアウトしないオプションであ る。そこで、 exampIe2 ディレクトリを return 0 ; 図 18 di 幵サプコマントを使用する BSD magazine 2000 No. 3

4. BSD magazine No.3 BSDではじめよう! ; BSD日本語環境構築術

グを付ける。 —r REL_OI_FIX % cvs rtag REL—OI example この rtag はリポジトリに対してタグを 付けるので、チェックアウトしたディ レクトリで実行する必要はない。 設定したタグをチェックアウトコマ ンドで指定すれば、その時点のソース を再構成できる。 新しい別のディレクトリで図 14 のよ うに行えば、そのディレクトリ下の exampl には SNAP ー 000209 や REL 01 と タグを付けた時点のソースが復元され る。タグを付けてチェックアウトした ファイルは、修正したりファイルを追 加することができないので、チェック アウトを実行するよりは exp 。 rt コマンド を使用するほうがよいだろう ( 図 15 ) 。 export コマンドは checkout とほとんど同 じであるが、 cvs の管理ディレクトリ アウトを行う。 % cd exampl CVS checout cd -/fixdir exampl そこで、通常の修正や追加を行って、 コミットすればファイルが修正される。 % CVS commit % cvs add NEWFILE % cvs diff -c example 工 ndex : example . c . C RCS file : /usr/home/kogane/cvsroot/exampl/example. c , v retrieving revision 1 . 2 diff -c ーて 1 . 2 example . c 2000 / 01 / 26 15 : 59 : 44 * * * example . C example. c 2000 / 01 / 26 16 : 32 : 13 * * * 11 , 14 * * * * 11 , 15 1 . 2 十 printf ( "This is CVS example program*n't ) ; printf ( "first change*n" ) ; return 0 ; % cvs diff —u example. c lndex : example . c RCS file : /usr/home/kogane/cvsroot/exampl/example. c , v (cvs) が作成されない。 ブランチの指定 1 6 ) 。 REL-OI-FIX のタグが設定された せすにタグを付けることができる ( 図 rtag コマンドを使えば、チェックアウト % cvs tag —b REL—OI—FIX % cvs checout ーて REL—OI exampl を実行する。 して、そのディレクトリで tag コマンド バージョンでチェックアウトする。そ tag コマンドを使う場合は、まず古い 指定したタグはプランチタグとなる。 マンドに -b オプションを指定すると、 チを設定することである。 tag 、 rtag コ のもうひとつの重要な機能は、プラン ランチを指定する。 tag 、 rtag コマンド うためには、そのバージョンからのプ 古いバージョンを元にして修正を行 BSD magazine 2000 NO. 3 なら、新しいディレクトリでチェック 70 retrieving 1 . 2 diff ーⅡ—rl . 2 example. c example. c 2000 / 01 / 26 15 : 59 : 44 + + + example. c 2000 / 01 / 26 16 : 32 : 13 ー 11 , 4 + 11 , 5 1 . 2 printf ("This is CVS example program*n") ; 十 printf ( "first change*n" ) ; return 0 ; 図 19 - c オプションを使用する % cvs diff example. c lndex : example . c RCS file : /usr/home/kogane/cvsroot/exampl/example . c , v retrieving revision 1 . 2 diff —c ーて 1 . 2 example. c 2000 / 01 / 26 15 : 59 : 44 * * * example . c example. c 2000 / 01 / 26 16 : 32 : 13 * * * 11 , 14 * * * * 11 , 15 1 . 2 printf ( "This is CVS example program*n") ・ printf ( "first change*n") ; 十 return 0 ; 図 20 . cvs 「 c にオプションを指定した場合

5. BSD magazine No.3 BSDではじめよう! ; BSD日本語環境構築術

図 33 のようにリビジョン番号が逆に なった場合は、リビジョン 1.4 と 1.6 の 間の変更を削除する意味になる。 変更履歴を見る 変更履歴を調べるためには log サプコ マンドを使用する。 ファイルを省略すれば、すべてのリ ポジトリについて表示する ( 表示結果 は省略する ) 。 : 3 + 3 ー 2 % cvs 10g 誰がチェックアウトしているかを見る チェックアウトの情報を表示するに + 0 ー 0 RCS file : /usr/home/kogane/cvsroot/exampl/example. c , v % cvs 10g example . c keyword substitution: kv myname : 1 . 1 . 1 start : 1 . 1 . 1 . 1 symbolic names : access list: locks: strict branch : head : 1 . 2 Working file : example. c total revisions: 3 ; description: revision 1 . 2 selected revisions date: 2000 / 01 / 26 15 : 59 : 44 ; first change ・ revision 1 . 1 date: 2000 / 01 / 26 14 : 45 : 28 ; branches : 1 . 1 . 1 ; lnitial revision revision 1 . 1 . 1 . 1 date: 2000 / 01 / 26 14 : 45 : 28 ; initial import . author : author : author : kogane ; kogane ; kogane ; state: state: state.• Exp ; Exp ; Exp ; lines : lines : は、 hist 。 ry コマンドを使用する 35 ) 。 同じリポジトリを他の人がチェック アウトしている状況を表示するには、 - a オプションを指定する ( 図 36 ) 。 ( 図 1 .3.2.3 1 .3.2.2 1 .3.2.1 RELOI_FIX ブランチ 図 34 log サプコマンドを使用する cvs history cvs history 0 01 / 26 16 : 31 cvs history M 01 / 26 16 : 31 =exampl= -/work/* 0 01 / 26 16 : 31 + 0000 kogane exampl 図 35 histo Ⅳコマンドを使用する + 0000 kogane exampl 0 01 / 16 03 : 53 + 0000 friend exampl =exampl= =exampl= -/work/* &/fwrk/* 図 36 history コマンドに - a オプションを指定する —C example . C A 01 / 26 15 : 59 + 0000 kogane 1 . 1 + 0000 kogane 1 . 2 example. c exampl example ・ c exampl &/work/exampl -/work/exampl 図 37 histo コマンドでコミットの履歴を調べる cvs status example. c Sticky Options : Sticky Date : Sticky Tag: Repository revision: Working revision : FiIe: example . c Status : 1 . 2 1 . 2 (none) (none) (none) LocaIIy M0dified Wed Jan 26 16 : 31 : 54 2000 /usr/home/kogane/cvsroot/exampl/example . c , v 7 イ 図 32 2 つのヨオプションによるマージ BSD magazine 2000 NO. 3 図 38 status コマンドを使用する

6. BSD magazine No.3 BSDではじめよう! ; BSD日本語環境構築術

ただ、プランチの変更でファイルの 追加コマンドである add サプコマンドを 行うと、削除されたファイルが入る Attic ディレクトリに入れられる ( 図 17 ) 。そして、このファイルは、「メイ % cvs —f diff example . c 工 ndex : example . c 2 ⅱ尾、を . C , V . C , V ー 2 , 15 Exp $ " ・ ンツリーに存在しないファイルである」 ということで削除されたファイルとし て登録されてしまう。削除されたファ イルというのが気になるかもしれない が、そのような仕組みになっていると RCS file : /usr/home/kogane/cvsroot/exampl/example 13a14 diff —rl . 2 example . c retrieving revision 1 . 2 return 0 ; 図 21 lndex : example . c % cvs diff —r 1.1 example. c cvs の - f オフションを使用する RCS file : /usr/home/kogane/cvsroot/exampl/example retrieving reviSIon 1 . 1 diff -c ーて 1 . 1 example ・ c 2000 / 01 / 26 * * * example. C 2000 / 01 / 26 example . c 14 : 45 : 28 16 : 32 : 13 1 . 1 * This is CVS example file . ! static char rcs_id ロ $ld: example. c,v 1.1 2000 / 01 / 26 14 : 45 : 28 kogane Exp $ "$ld: example. c,v int main(int argc , char *argv ロ ) 1 . 1 2000 / 01 / 26 14 : 45 つ ; printf ("This is CVS example program*n This is CVS example file . $ld: example. c,v 1 .2 2000 / 01 / 26 15 : 59 : 44 kogane Exp $ ! static char rcs_id[] "$ 工 d: example . c,v 1 . 2 2000 / 01 / 26 15 : 59 : 28 kogane Exp : 44 kogane 十 十 注 2 int main(int argc , char *argv ロ ) printf("first change*n") ; printf ( "This is CVS example program*n return 0 ; 前に述べたように、 cvs は diff コマンドを内蔵している。 図 22 特定のリビジョンとの比較 いうことで納得するしかない。このフ ァイルは、メインツリーにマージする checkout-j オプションでマージすること により、 Attic から通常のディレクトリ に移動する。「 ( 13 ) マージ」参照。 ーーソースファイルの差分を見る チェックアウトしたディレクトリで、 どのようにファイルを修正したか知り たくなることがある。そのようなとき は、 diff サプコマンドを使用する ( 図 18 ) 。これは、 14 行目に return 0 ; を追加 した状態であることを示している。 のような表示は、 diff コマンドの標準の 一時的に . cvsrc のオプションを見て欲 示される ( 図 20 ) 。 を実行してもコンテキスト di 仕形式で表 これで、オプションのない diff コマンド diff —c # # で始まる行はコメント % cat ~/ . cvsrc ればよい。 トリの . csvrc ファイルに次のよう記述す そのような場合には、ホームディレク ションをつけて表示したくなるだろう。 この diff コマンドのように、常に一 c オプ 示されるので、差分が見やすくなる注 2 。 れらの表示では、ソース行の前後が表 オプション ) 形式が使える ( 図 19 ) 。 プション ) とか、ユニファイド diff (-u マンドと同様にコンテキスト diff ()c オ di サプコマンドでは、 UNIX の diff コ % cvs diff ( 表示結果は省略する ) 。 すべてのファイルの差分が表示される ファイル名を省略するとリポジトリ 表示と同じである。 2000 No. 3 BSD magazine

7. BSD magazine No.3 BSDではじめよう! ; BSD日本語環境構築術

2 プ回クラミプクをはしめよう ! のファイルだけを置くこと。 図 5 initialimport. と書き込む % ls &/cvsroot/CVSROOT . #checkoutlist . #notify commitinfo ,V history . #commitinfo . #rcsinfo config loginfo . #config . #taginfo config,v loginfo ,v . #cvswrappers . #verifymsg modules cvswrappers . #editinfo checkoutlist modules ,V cvswrappers , V . #loginfo checkoutlist ,v editinfo notify . #modules commitinfo editinfo,v notify,v 図 4 import コマンドでエデイタか起動する rcsinfo rcsinfo,v taginfo taginfo , v verifymsg verifymsg, % ls newdir example . c % cd newdir 次に cvs import コマンドを実行する が、このとき、カレントディレクトリ にあるファイルとカレントディレクト リ以下のすべてのファイルが管理対象 となる。 example. c を新しいディレクト リに入れたのは、このためだ。 cvs import コマンドの形式は図 3 のよ うになっている。 リポジトリは貯蔵書、倉庫という意 味で、これから管理しようとするファ イル全体を表す名称である。ソフトウ ェアの場合は、プログラム名とかモジ ュール名とかになるであろう。 べンダーは売る人、行商人という意 味である。プランチにつけられる名称 であるが、これは私にもよくわかって いないので、適当な名前をつけていた だきたい。自分の名前とか会社名でよ いであろう。 3 初期登録 ( インホート ) 識別するためのマークである。最初の リリースタグは、リリースにつけら それでは、 cvs で管理するファイル マークはコメントの中に、次は文字列 れるタグである。リリースの時点で意 を作成する。なんらかのエデイタを使 の中に記述している。通常はコメント 味を持つが、最初であるから、 initial と って、リスト 1 のようなファイルを作成 内のもののみでよいだろう。 か start とか REL ー 0 でも良いだろう。タ ( ドット ) は使えないので、 このファイルの置き場所は重要であ グに 0 この中にある $ld$ は、リビジョンを る。新しいディレクトリを作成し、 release 3.1 とかを表現する場合には RELEASE_3_I のようにする。 それでは、 import コマンドを実行し 図 2 cvsinit によって作成されるファイル cvs import [—option] repository vendortag releasetag カタカナにすると cvs import C-option] リポジトリべンダータグリリースタグ 図 3 cvs import コマンドの形式 CVS : CVS : Enter Log ・ Lines beginning with 、 CVS : are removed automatically CVS : CVS : CVS : CVS : Enter Log ・ Lines beginning with 、 CVS : are removed automatically CVS : CVS : initial import. マリスト 1 CVS で管理するファイル (example.c) 0 #include く stdio . h> $ld$ static char rcs—id ロ This is CVS example file . % cvs import exampl myname start そうすると、エデイタが起動される。 標準は v i である。環境変数 c v s EDITOR または EDITOR に自分の好み のエデイタを指定しておけば、それが 起動される。 ェデイタの画面は、図 4 のような内 BSD magazine 5 2000 NO. 3 int main(int argc , char *argv ロ ) printf ("This is CVS example program*n" ) ;

8. BSD magazine No.3 BSDではじめよう! ; BSD日本語環境構築術

ていこう。まず実行例の 3 行目である。 こでは /usr/libexec/cpp というコマンド が起動されている。このコマンドは c のプリプロセッサ (C Preprocessor) で あることは名前から容易に想像がっく と思う。この行の最後からわかるよう に、 hello.c を入力としてプリプロセス の処理後のコードを / tmp / CCB60718. i と いうファイルに格納しているのだ。次 は 13 行目に目を移していただきたい。 このイ丁では /usr/libexec/ccl というコマン ドが起動されていることがわかる。実 はこれが c コンパイラと言われるもので あり、さきほどのプリプロセス処理後 のファイル /tmp/ccB60718. i を入力とし て、 /tmp/cc160718. s というファイル ( -0 オプションで指定 ) が作成されている ことがわかる。 . s という拡張子はアセ ンプリ言語を表わす。次は 15 行目だ この行では、 /usr/libexec/elf/as というコ マンドが起動されている。入力ファイ ルはさきほど /usr/libexec/ccl が作成した アセンプリコードが収められている / tmp / Cd60718. s 、出力ファイルは一 0 で 指定されている / tmp / CCq60718.0 である。 この .0 ファイルがオプジェクトファイル と呼ばれるものであり、 CPU が理解で 2 ~ は第物第を ー C きる形になっているのだ。最後のステ ージは 17 行目である。こではリンカ である /usr/libexec/elf/ld が起動され、オ プジェクトファイル / tmp / CCq60718.0 と 実行ファイルを作成するために必要な さまざまなモジュールをリンクし、最 終的な a. out という実行ファイルを作成 する ( 出力ファイル名は一。オプション を用いて指定しなければ a. 。 ut になる ) 。 こまでくれば、実は cc というコマ ンドはコンパイラそのものではなく、 コマンドドライバ、つまりプリプロセ ッサやコンパイラ、アセンプラ、リン 力といったそれぞれのコマンドを起動 するためのプログラムであることがわ かると思う。 GNU の開発環境では、 c や c + + 、 Objective-C で書かれたソース コードは 1 つのコマンド ()c もしくは gcc) で処理されるように統合されてい る。そこで、 cc コマンドは、与えられ たファイル名の拡張子から言語を判断 し、それぞれの言語用の処理コマンド を起動する。拡張子と言語や処理ステ ージとの対応は表 1 のようになってい る。 さて、通常のプログラミングでは、 上のように ソースコードを cc コマン CC CC CC C C C C ー 0 malli . 0 malll . C —c ー 0 subl . 0 subl . c ー 0 sub2.0 sub2. c ー 0 sub3.0 sub3. c ー 0 f00 main . 0 subl . 0 sub2.0 sub3.0 図 7 表 1 拡張子、一語、処理ステージの対応 ロロロ Objective-C 複数ファイルから実行ファイルを作成する手順 拡張子 . C . CC . CXX . S . S 処理ステージ プリプロセス、 プリプロセス、 プリプロセス、 プリプロセス、 プリプロセス、 コン / ヾイ丿レ、 コン / ヾイル、 コン / ヾイ丿レ、 コン / ヾイ丿レ、 コン / ヾイル、 アセンブル、 アセンブル、 アセンブル、 アセンブル、 アセンブル、 リンク リンク リンク リンク リンク プリプロセス後の C プリプロセス後の C + + アセンブリコード アセンブリコード コンパイル、アセンブル、リンク コンパイル、アセンブル、リンク アセンブル、リンク プリプロセス、アセンブル、リンク ドに渡せばすぐに実行ファイルが生成 されるというものではない。実際のソ ースコードは複数のファイルから構成 されることが普通であり、そのために 以下のような手順を取る。 あるソフトウェアが main. c 、 subl.c 、 sub2. c 、 sub3. c 、 f00. h というファイルか ら構成されるとしよう。そして、実行 ファイルは foo という名前だとする。 のとき、 4 つの C のソースファイルをそ れぞれコンパイルしてオプジェクトフ ァイルを生成し、それらをリンクする ことによって最終的な実行ファイル foo が生成されるのだ。つまり、図 7 のよ うな手順を経て、実行ファイル f 。。が生 成されるのだ。賢明な読者の方々はお 察っしのことと思うが、上の実行例の 最初の 4 つのように、 cc コマンドに一 c オ プションを付けると、プリプロセス、 コンパイル、アセンプルの二段階の処 理をし、オプジェクトファイルを生成 する。生成されるファイルの名前は一。 オプションで指定可能だ。最後の処理 は生成されたオプジェクトファイをリ ンクして実行ファイルを生成するため のものであるが、こでも出力ファイ ルの名前は一。オプションで指定可能だ。 さて、実際のソフトウェアでは、さ らにソースファイルの数は多くなるの が普通であり、各処理をいちいち手で 行っていたのでは煩わしてく仕方がな い。そのために make という便利なコマ ンドがあるのだが、これは後で解説す ることにしよう。 デバッグ プログラミングというのは人間が行 うものであり、そのため必すバグが存 在することになる。どんなに完璧だと 思うプログラムでも、やはりバグは存 在するものなのだ。したがって、バグ の取り方をしつかりとマスターし、 2000 NO. 3 BSD magazine ノヾ 55

9. BSD magazine No.3 BSDではじめよう! ; BSD日本語環境構築術

encryption がサポートされました。 ・ Riscom/N2 同期シリアルカードが ntwoc ドライバによってサポ ートされました。 ・ aue 、 kue 、 cue USB Ethernet ドライバが追加されました ・ IEEE 802.11 のメディアタイプを決定することができるように なりました。 ・ CardBus における pccard の電源オンオフに関する問題が解決 しました。 ・ ADP -1480 CardBus SCSI カードが ahc で利用できるようになり ました。 ・ /etc/daily 、 /etc/monthly 、 /etc/weeklyi それぞ Wetc/daily.locals なりました。しばらくしたらライプラリからなくなります。 ・ SIOCSIFDSTADDR IN6 と SIOCSIFNETMASK_IN6 は不要と うになりました。 ・ getaddrinfo の検索順序に nsswitch. conf の設定が反映されるよ 索するようになりました。 検索するという順序から、 /etc/hosts を検索してから DNS で検 ・ nsswitch. conf の標準状態が、 DNS を検索してから /etc/hosts を ・ socket の引数に IPV6-BINDV60NLY が利用できるようになり できるようになりました。 ・ ld. elf. ー s 。が強化され、ハードウェア依存のライプラリを認識 ・ ipfilter が version 3.3.8 べースになりました。 ることができるようになりました。 することで、 ALIGNBYTES を kernel のコンパイル時に設定す ・ sysctl(3) に hw. alignbytes が追加されました。この機構を利用 その他 また、 getifaddrs も取り込まれました。 を記述することで、 login ( 1 ) 、 su(l) 、 rshd ( 8 ) が制御できます。 ・ BSDI 実装から、 login_cap が移植されました。 /etc/login. conf ・ Menu ライプラリが追加されました。 ・ⅲ ist ( 3 ) が COFF シンポルテープルをサポートしました。 ⅱ bc ライプラリ ・ ISAdptSCSI アダブタがサポートされました。 ・ AdvanSysLVD SCSI アダブタがサポートされました。 ・ネットワークデバイスの取り外しができるようになりました。 ・ pccard の取り外しに関するコードが加わりました。 フロジェクト短信 /etc/monthly. locaK /etc/weekly. 10C引を呼び出すようになりま 0 UserIand P 「 og 「 am ほか ・ pax(l) が GNU tar 形式の long filename を扱えるようになりまし た。また、 - p のオプションに f が加わりました。 ・ ftp ( 1 ) のコマンドに set 、 unset 、 usage か加わりました。また、 set prompt と set rprompt が加わりました。 ・創 e ( 1 ) コマンドが、 file -3.28 べースになりました。 ・ systat(l) コマンドが bufcache を表示できるようになりました。 また、 t 叩 ( 1 ) のようにプロセステープルが見られるようになり ました。さらに、 IPv6 の netstat も見られるようになっていま す。 ・ tar(l) 、 at ( 1 ) の Y2K 問題が修正されました。 ・ fstat(l) 、 rsh(l) 、 rlogin(l) が IPv6 をサポートしました。 ・ゆ d ( 8 ) 、 syslogd(8) 、 rshd(8) 、 rlogind(8) が IPv6 をサポートしま 0 ・ update(8) コマンドが削除されました。現在は ckle sync が実 装されているため、不要になったものです。 ・ newsyslog(8) がいろいろと強化されました。 ・ user(8) 、 gro 叩 (8) コマンドが追加されました。 SVR4/Solaris の それと同等の働きをします。 ・ ftpd ( 8 ) が強化されました。 user ごとのクラス設定、接続数上 限の指定などです。詳しいことは、マニュアルを見てくださ ・ netstat ( 8 ) がインターフェイスごとに状態を出力できるように なりました。 ・ ifconfig(8) が nwid デバイスの設定ができるようになりました。 ・ pim6sd(8) が追加されました。 IPv6 で PIM sparse mode ・ sendmail(8) が 8.9.3 になりました。 ました。 ・甲 c. 1 。 ckd ( 8 ) が NFSv3 で利用されるⅲ m version 4 をサポートし ・ rshd(8) : IPv6 support from KAME. [itojun 20000131 ] (MuIticast) の経路制御ができるようになりました。 また、 IPv6 を利用した ftp でインストールできるようになって ・ sysinst が、 IPv6 自動設定をサポートするようになりました。 ・ grep(l) が grep-2.4 にバージョンアップしました。 います。 2000 No. 3 BSD magazine 279

10. BSD magazine No.3 BSDではじめよう! ; BSD日本語環境構築術

- プ回クラミ町クをはしめよう ! コミットの履歴を調べる コミットの履歴を調べるのにも、 history コマンドを使用する ( 図 37 ) 。 ファイルを省略すれば、すべてのフ % cvs -H ァイルのコミットの履歴について表示 する ( 表示結果は省略する ) 。 % cvs history —c Usage : cvs [cvs—options] command [command—options—and—arguments] where cvs—options are —q, ーⅡ , etC. (specify ——help—options for a list Of options) where command is add, admin, etc . (specify ——help—commands for a list Of commands Pasca1 M011 辷 s CVS site at http://www.10てia.frrmolli/cvs—index.html CycIic Software at http : //www. cyclic.com/ or For CVS updates and additional information, see The Concurrent Versions System (CVS) is a t001 for version control. Specify ——help tO receive this message (specify —H followed by a command name for command—specific help) where command—options—and—arguments depend on the specific command or ——help—synonyms for a list 0f command synonyms) (specify ——help—commands for a list 0f commands where command is add, admin, etc . (specify ——help—options for a list Of options) where cvs—options are —q, ーⅡ , etC . Usage : cvs [cvs—options] command [command—options—and—a て guments] —help—optiosn ー CVS : unrecognized option % cvs ——help-options 図 39 - H オプションを使用する Pasca1 M011 辷 s CVS site at http://www.loria.fr/-molli/cvs—index.html CycIic Software at http://www.cyclic.com/ or For CVS updates and additional information, see The Concurrent Versions System (CVS) is a t001 for version control. Specify ——help t0 receive this message (specify —H followed by a command name for command—specific help) where command—options—and—arguments depend on the specific command or ——help—synonyms for a list Of command synonyms) リビジョンが登録された日時 (UTC)0 リビジョンを登録したユーザーのログイン名。 説明 図 40 cvs のオプションの表示 $State$ $Source$ $Revision$ $RCSfiIe$ $Name$ $ Log$ $ Locker$ $Header$ $Date$ $Author$ キーワード 表 1 置換されるキーワード 17 status コマンド ら、図 41 のように指定する。 サプコマンドがわからなくなったな 図 40 のようにする。 cvs のオプションを知りたいときには は、一 H オプションを使用する ( 図 39 ) 。 cvs コマンドの形式を忘れたとき c s コマンドの形式を忘れたとき % cvs status する ( 表示結果は省略する ) 。 ァイルのコミットの履歴について表示 ファイルを省略すれば、すべてのフ 表示する ( 図 38 ) 。 status コマンドで、ファイルの状態を 参照のこと。 FreeBSD の man cvs または jman cvs を コマンド形式 に含まれていれば置換される。 表 1 のキーワードがソースファイル中 置換されるキーワード その他の事項 ンドを指定する ( 図 42 ) 。 知りたいときは、 - H に続けてサプコマ サプコマンドの形式やオプションを 標準的なヘッダ。 RCS ファイルのフルバス名、リビジョン番号、日時、作者、状態、ロック者 ( ロックされている場合 ) が埋め込まれ る。 CVS の場合、通常ファイルはロックされない。 RCS ファイル名がフルバスでないことを除いて、 $Header$ と同様。 リビジョンをロックしたユーザーのログイン名 ( ロックされていない場合は空 ) 。 CVS の場合、無意味。 RCS ファイル名、リビジョン番号、作者、日時に続いて、チェックイン時に与えたログメッセージが挿入される。 ファイルをチェックアウトしたときに使用したタグ名。 パス名を含まない日 CS ファイル名。 リビジョン番号。 日 CS ファイルのフルバス名。 リビジョンに cvsadmin の - s オプションにより割り付けられた状態。 2000 NO. 3 BSD magazine