* 第6回 UNIXプログラミング [#ybe93055]

''【警告】 自分の席の周りにゴミを散乱させて、めちゃくちゃ汚くして帰っていった者がいますが、常識的なマナーに照らして到底許されることではないです。当然減点しますし、繰り返せば点がなくなります。''

** 目次 [#q73cc2bb]

#contents

** 参考になる情報 [#u17a6b6a]

- C言語の教科書などを持っているなら参考になりますので用意してきて下さい。
- また、「C言語入門」とか「Cプログラミング入門」とか「Cの書き方」などなど…の言葉で、検索してみて下さい。そして手ごろなページを選んで下さい。それを参考にして、以下の課題をやってみましょう。

** とりあえずコンパイル [#fd929214]

+ みなさんがインストールしたソフトウェアの中には、gccというCのコンパイラが入っています。コンパイルの仕方は以下になります。
 gcc ソースファイル名.c -o 実行ファイル名
+ まず、これで「Hello, world!」と表示するプログラムを作ってみて、動作を確認して下さい。
+ コンパイル結果(たとえばa.out)を実行するには、以下のように先頭に「./」をつける必要があります。
 ./実行ファイル名
-- 工学部のサーバでは「./」は不要だったと思いますが、みなさんのコンピュータ設定はカレントディレクトリが実行パスに含まれていないので、明示的に指定する必要があります。

** 課題(C言語プログラムの作成) [#j6a9bc11]

*** 提出方法 [#l5a61ce4]

できたソースファイルは、以下のページから自分の番号のページを開いてアップロードしてください。C言語のソースファイルのみを提出すればいいです(a.outはいらない)。ファイルはいくつでも添付できます。紛らわしくないファイル名をつけてからアップロードしてください。

- [[Linux/提出]] 

まず試しに、上で作成した「Hello world!」と表示するプログラムを、アップロードしてみてください。

*** 課題1. ウォーミングアップ [#o783763b]

キーボードから10個の整数を読み込んだ後、平均以上の数値と平均未満の数値に分けて表示するプログラムを作りなさい。

*** 課題2. ファイルの読み込み [#ld261455]

前回作成したLaTeXファイルの文書ファイルを開き、中身を読み出して、画面に表示するプログラムを作成しなさい。標準ライブラリ関数 fopen, fclose, getc, putchar を用いなさい。

*** 課題3. 自作コマンドの作成(後回しにしたほうがいいかも…) [#m1910880]

コマンドラインで与えられた文字列を、標準ライブラリ関数 toupper を用いてすべて大文字に変換した後、画面に表示するプログラムを作成しなさい。(全部大文字に変換するecho)
 ./upecho I am a boy.
  I AM A BOY.
>【コマンドライン引数】 プログラム実行時のコマンドラインの引数は、メインの引数として取得することができる。
 int main(int argc, char *argv[]);
このargcに、コマンドライン引数の個数、argvにそれぞれの引数の文字列が得られる。
 int main(int argc, char *argv[])
 {
     int i;
     for (i = 0; i < argc; i++)
         printf("%s\n", argv[i]);
 }

*** 課題4. ファイル名のコマンド引数 [#yfdd4bdb]

整数が1つ書き込まれたファイルをあらかじめ作っておく。コマンドの引数にそのファイル名を与えてコマンドラインから起動すると、引数で指定したファイルから整数を読み出して画面に表示するプログラムを作成しなさい.

*** 課題5. カウンタプログラム [#t98fdff9]

以下に示すような動作をするプログラム「counter.c」を作成しなさい。その際、カッコ内の指定の関数を使用すること。

+ 読み込みモードで「counter.dat」というファイルを開く。(fopen)
+ そのファイルから、整数を1つ読み込む。(fscanf)
+ いったんファイルを閉じる。(fclose)
+ 読み込んだ整数に1を加える。
+ 整数の値を、画面に表示する。
+ 今度は、書き込みモードでファイルを開く。(fopen)
+ 結果をファイル「counter.dat」に書き戻す。(fprintf)
+ ファイルを閉じる。(fclose)

プログラムをコンパイルして動かし、きちんと動作することを確認してください。このプログラムは先の回で利用するので(たぶん)、分かるように保存しておいてください。
 ./counter
 1
 ./conter
 2
 ...以下続く...

----
CENTER:★ ★ ★ 目 標 ★ ★ ★
----

*** 課題6. コマンドオプションの解析(上級) [#z1866e4f]

課題5.のカウンタプログラムを改良して、コマンドオプションによって作動する以下のような機能を付け加えなさい。できるところまで機能を付け加えなさい。

- 引数に「-n」がある場合には、カウントアップせずに現在の数値を表示する。
- 引数に「-k」(小文字)がある場合には結果を''漢字''で表示する。つまり「746」の代わりに「七四六」と表示する。(ファイルはEUCコード)
- 引数に「-K」(大文字)がある場合には''漢数字''で表示する。つまり「七百四十六」と表示する。「-k」と「-K」がある場合には、「-K」が優先する。
- 引数に「-数字」がある場合には「0」(ゼロ)を補ってその桁数で表示する。つまり「-5」の場合には「12」のかわりに「00012」と表示する。ただし、「-K」とは組み合わせても効果はない。

 ./counter -k
 一五
 ./counter -n
 15
 ./counter -5
 00016
 ./counter -K
 十七
 ./counter -n -k
 一七
 ./counter -k -5
 〇〇〇一八

*** 課題7. システムコールによる入出力(上級) [#x96873b4]

課題2と同様なプログラムを、UNIXのシステムコール open, close, read, write を用いて作成しなさい。
- fopen → open
-- http://www.linux.or.jp/JM/html/LDP_man-pages/man2/open.2.html
- fclose → close
-- http://www.linux.or.jp/JM/html/LDP_man-pages/man2/close.2.html
- getc → read
-- http://www.lnux.or.jp/JM/html/LDP_man-pages/man2/read.2.html
- putchar → write(出力先のファイルディスクリプタは1)
-- http://www.linux.or.jp/JM/html/LDP_man-pages/man2/write.2.html

- 参考
-- http://www.kaimei.org/note/book_in/sys_call.html

*** 課題8. system関数による子プロセスの起動(上級) [#w1f292f0]

以下に示すような動作をするプログラムを作成しなさい。

+ まず、画面に次のようなガイドを表示して、入力を読み込む。
 コピー元ファイル名? hogehoge.c
 コピー先ファイル名? fugafuga.c
+ すると、入力された文字列(この例では「hogehoge.c」と「fugafuga.c」)を引数として、「cp」コマンドを自動起動する。(system関数)
+ その結果、次のコマンドを実行したのと同じ結果が得られる。
 cp hogehoge.c fugafuga.c

- http://www.linux.or.jp/JM/html/LDP_man-pages/man3/system.3.html

*** 課題9. popen関数による子プロセスの起動(上級) [#o9877d3c]

sin(0°)からsin(360°)までの値を、1°刻みで画面に表示するプログラムを作成しなさい。そのとき、出力を「popen」関数で起動した「more」コマンドに渡すことで1画面ずつ表示するようにしなさい。popen で more コマンドを起動し、そのファイルポインタに fprintf で出力を書き込めばよい。

- http://www.linux.or.jp/JM/html/LDP_man-pages/man3/popen.3.html
- http://www.linux.or.jp/JM/html/LDP_man-pages/man3/sin.3.html

*** 課題10. システムの環境変数の取得(上級) [#n7f97d5e]

UNIXの環境変数をすべて取得して表示するプログラムを作成しなさい。以下のコマンドと同じ出力結果になればよい。環境変数とは何か調べなさい。
 printenv
- http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getenv.3.html

** 第4回レポート [#xadd1ba1]

上の課題をできるところまでやって、提出してください。

- [[Linux/提出]] 

早々に全部終わってしまった人は、私に申し出てください。早すぎる場合には、課題を作ります(苦笑)。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS