システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ

Slides:



Advertisements
Similar presentations
システムプログラミング 情報工学科 篠埜 功 情報工学科 3 年生対象 専門科目 第5回 シェルスクリプトの続 き レポート課題 main 関数の引数 usage メッセージ.
Advertisements

システムプログラミング 第10回 情報工学科 篠埜 功. 今回の内容 プロセス(続き) – execve システムコール 現在のプロセスを、引数に与えられたファイル(実行 形式ファイルあるいはシェルスクリプト等の実行可能 なファイル)を受け取り、現在のプログラムをそれで 置き換える(変身)。 fork.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
システムプログラミング 第6回、7回 main関数の引数 usageメッセージ システムコールのエラーメッセージ ファイル
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
プログラミング入門2 第1回 導入 情報工学科 篠埜 功.
C言語 配列 2016年 吉田研究室.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
第13回 プログラミングⅡ 第13回
アルゴリズムとデータ構造 補足資料6-3 「サンプルプログラムcat3.c」
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
システムプログラミング 第6回、7回、8回 情報工学科 篠埜 功.
システムプログラミング 第9回 、10回 ハードリンク、シンボリックリンク プロセスの生成
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
プログラミング 4 記憶の割り付け.
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
デバッガ dbx の使い方.
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
システムプログラミング 第3回、第4回、第5回、第6回 情報工学科 篠埜 功 makeコマンド 動的リンクライブラリ シェルスクリプト
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
第11回 プログラミングⅡ 第11回
演習1の解答例の解説 2006年11月8日 海谷 治彦.
プログラミング入門 第12回 情報工学科 篠埜 功.
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
UNIX演習 情報ネットワーク特論.
関数の再帰呼び出しとは ハノイの塔 リダイレクト レポート課題
プログラミング基礎B 文字列の扱い.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
情報工学科 3年生対象 専門科目 システムプログラミング 第4回 シェルスクリプト 情報工学科 篠埜 功.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
C言語 はじめに 2016年 吉田研究室.
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
UNIX演習 情報ネットワーク特論資料.
UNIX演習 情報ネットワーク特論資料.
UNIX演習 情報ネットワーク特論資料.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
プログラミング入門2 第13回、14回 総合演習 情報工学科 篠埜 功.
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
システムプログラミング 第10回 プロセス間通信3 簡易Web server(準備) Chat プログラム 担当:青木義満、篠埜 功
第5回 プログラミングⅡ 第5回
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
システムプログラミング 第9回 、10回 ハードリンク、シンボリックリンク プロセスの生成
標準入出力、変数、演算子、エスケープシーケンス
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
アルゴリズムとデータ構造 補足資料6-1 「サンプルプログラムcat1.c」
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
情報処理Ⅱ 2005年11月25日(金).
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ 情報工学科 3年生対象 専門科目 システムプログラミング 第5回 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ 情報工学科 篠埜 功

今日の内容 ヒアドキュメント レポート課題出題 Cプログラムのmain関数の引数について Usage メッセージについて

ヒアドキュメント シェルスクリプト内部で、コマンドへのキーボードからの入力を シェルスクリプト内に直接書いておくことができる。 コマンド << str ……… str のように、<<の右に区切り文字列を(自分で決めて)書き、その次の行から、指定した文字列が最初に現れるまでの部分を、ファイルからコマンドへ < でリダイレクトしたのと同等の効果がある。

ヒアドキュメントの例1(打ち込んで確認) #!/bin/sh cat << EOF <html> <body> hello </body> </html> EOF 上記のようにある程度長いメッセージを出力したい場合、ヒアドキュメントを使うときれいに書ける。

ヒアドキュメントの例2(打ち込んで確認) #!/bin/sh cat << EOF > sample.c #include <stdio.h> int main (void) { printf ("test\n"); return 0; } EOF gcc -o sample sample.c ./sample これはシェルスクリプト内でCのファイルを作成し、コンパイルして実行する例である。

レポート課題2 課題2-1, 2-2, 2-3の3つの課題(後述)のシェルスクリプトをkadai2-1.sh, kadai2-2.sh, kadai2-3.shというファイル名で作成せよ。

レポートの提出方法 □ 下記のファイルを作成し、提出 kadai2-1.sh, kadai2-2.sh, kadai2-3.sh, kadai2.txt □ 提出方法 システムプログラミング講義用の課題提出用フォルダ内にあるkadai2というフォルダの中に自分の学籍番号を名前とするフォルダを作成し、その中に上記ファイルを置く。kadai2.txt内に学籍番号、氏名、日付、および作成したプログラムの簡単な説明を記載する。 □ 提出期限   11月15日 23:59 まで。締め切り後に提出した場合、成績への反映を保証しない。

課題2-1 テキストファイルのファイル名をシェルスクリプトの引数として受け取り、そのファイルが存在すればファイルの中身を表示し、存在しない場合には、   ファイル名: No such file exists. と表示して終了するようにせよ。実行方法は、 $ ./kadai2-1.sh test.txt のようにファイル名を引数として与える。この場合、test.txtというファイルが存在すれば中身を表示する(表示はcatコマンドを使えばよい)。存在しなければ上記のメッセージを表示する。 ファイルの存在確認は、testコマンドを用いて、 test –f ファイル名 で行うようにせよ。コマンド “test –f ファイル名” の終了statusは、そのファイルが存在して通常のファイルなら真、そうでなければ偽である。

課題2-2 課題2-1のプログラムに,引数の個数チェックを行う処理を追加し、ファイル名が引数に与えられなかった場合、 $ ./kadai2-2.sh Usage:./kadai2-2.sh filename のようにエラーメッセージを表示するようにせよ。 引数の個数は$#という変数に入っており、testコマンドで test $# -eq 0 (あるいは [ $# -eq 0 ]) により、引数が0個かどうかを判定できる。 起動したコマンド名(この場合は./kadai2-2.sh)は$0に入っているのでそれを使う。

課題2-3 テキストファイルのファイル名とキーワードをキーボードから受け取り、指定した文字列を含む行を表示するシェルスクリプトをgrepコマンドを用いて作成せよ。 (実行例) text.txtのファイルの中にThis is a test. という行がある場合、 $ ./kadai2-3.sh Enter filename: test.txt Enter keyword: es This is a test. キーボードからの入力はreadコマンドで受け取る。 (例) read x とすると、変数xにキーボードからの入力が入る。 メッセージ表示後に改行しないようにするには echo –n …. のようにすればよい。表示する文字列の最後に空白を入れたい場合、表示する文字列を””で囲めばよい。 赤字の部分はキーボードからの入力

Cのmain関数の引数について /* コマンド名および引数を表示 */ #include<stdio.h> int main (int argc, char *argv[ ]) { for ( ; *argv; argv++) printf ("%s\n", *argv); return 0; } (実行例) $ gcc 1.c $ ./a.out abc 234 ./a.out abc 234 $

main関数の第3引数 #include<stdio.h> main関数は第3引数に環境変数の情報の配列が渡される場合がある。(ISO規格で定められているわけではなく、処理系依存。) #include<stdio.h> int main (int argc, char *argv[ ], char *envp[ ]) { for ( ; *envp; envp++) printf ("%s\n", *envp); return 0; } 演習室の環境では第3引数を受け取れる。第3引数はなくてもよい。環境変数はライブラリ関数getenv()で取得できるのでそれを使えばよい。

スタートアップルーチン C言語プログラムは、実行形式ファイルにするときにスタートアップルーチンとリンクされる。 スタートアップルーチンは、/usr/lib64/crt1.oにある。 $ gcc -print-file-name=crt1.o でcrt1.oの場所が表示される。 $ nm /usr/lib64/crt1.o でcrt1.oの中身を確認する。この出力結果に U main という行が含まれており、スタートアップルーチンがmain関数を呼び出していることがここに反映されている。 Uはmainが未定義であることを表す(main関数は別のファイルで定義される)。 スタートアップルーチン部分で引数の個数、引数の文字列配列、環境変数配列をmain関数に渡す。

コマンドのオプションについて オプションはハイフンのあとに1文字(-oなど) オプションのあとにオプションの引数があることもある (例) gcc –o main main.c など。 いくつかのオプションをまとめて記述することもある 例 ls -la は、ls -l -a をまとめて書いたものである。 --helpのように、ハイフンが2つの場合もある。(これは-h -e -l -pを-helpと書いた場合との区別のため)

Usage メッセージ オプションが正しく与えられなかった場合 (2) コマンドの引数に過不足があった場合 例えば、 $ cp のようにcpコマンドを引数無しで実行すると、Usageメッセージが表示される。

例(打ち込んで確認) (実行例) $ gcc usage.c $ ./a.out Usage: ./a.out filename #include<stdio.h> int main (int argc, char * argv[]) { if (argc!=2) fprintf (stderr, "Usage: %s filename\n", argv[0]); return 0; } (実行例) $ gcc usage.c $ ./a.out Usage: ./a.out filename