UNIXシステムコールプログラミングのページ(仮)

第1回

プログラム例

  1. コマンドライン引数
    • コマンドライン引数を、一行に一つずつ、順序通りに標準出力に出力するプログラム。
      • nara.c argc を使って個数を数える方法を使う。
      • ikoma.c argv[argc]NULL が入っていることを利用する方法を使う。
    • 正四面体数を順に出力するプログラム。 ただし、以下のオプションをとる。
      -r
      20カラム右揃えで出力する。
      -N 整数
      整数以下の正四面体数のみを出力する。指定しなければ無制限。
      -n 整数
      最初の整数個を出力する。デフォルト値は10。-Nと同時に指定したときは、-Nの引数として与えられた限界を超えると途中でも打ち切る。
  2. 標準入力から入力したテキストを加工して標準出力に出力するプログラムいろいろ
    • 入出力にC標準ライブラリを使用
      • vanilla0.c そのまま
      • lemon0.c アルファベット大文字をすべて対応する小文字に変換する
      • chocolate0.c 各行の行末に $ を追加する
      • peach0.c 空行を除去する
    • 入出力にUNIXシステムコールを使用
      • vanilla.c そのまま
      • lemon.c アルファベット大文字をすべて対応する小文字に変換する
      • chocolate.c 各行の行末に $ を追加する
      • peach.c 空行を除去する
  3. (欠番)

readシステムコールの使用上の注意

read()は読み込みに失敗しなければ返値として実際に読み込んだバイト数を返します。 したがって、入力したバイト列を操作することは、readの返値を変数に代入しておき、 その値までくりかえすループを書くことで実現できます。 たとえば、chocolate.cstrawberry.cで行っている次のようなコードをよく書きます。

while ((len = read(STDIN_FILENO, buf, sizeof(buf))) > 0) {
	for (j = 0; j < (size_t)len; j ++) {
		(略)
	}
	(略)
}
	  

注意すべきことがいくつかあります。

課題

    1. コマンドライン引数を、一行に一つずつ、以下の順序で標準出力に出力するプログラムを書け。
      • 最初に、アルファベットで始まる引数のみを出現順に出力する。
      • 次に、数字で始まる引数のみを出現順に出力する。
      • 最後に、残りの引数を出現順に出力する。
      ヒント1
      isalpha()isdigit()を使いましょう。文字コードの大小比較を使う方法は、環境依存で好ましくありません。
    2. 以下のオプションにも対応するよう、kyoto.cを改良せよ。
      -O
      奇数の正四面体数のみを出力する。
      -R 整数
      整数カラム右揃えで出力する。
      ヒント1
      オプション-R 整数の実装方法
  1. 標準入力からテキストを入力し、コマンドラインオプションに応じて以下の加工を行って出力するプログラムを書け。

    -e
    出力の各行の行末に $ を追加する
    -l
    アルファベット大文字をすべて対応する小文字に変換する
    -p
    空行を除去する
    1. 入出力にC標準ライブラリを使用せよ。

    2. 入出力にUNIXシステムコールを使用せよ。

  2. 標準入力からテキストを入力し、表示文字(isprint()が真を返す文字)の総文字数を標準出力に出力し、さらに、コマンドラインオプションに応じて以下も出力するプログラムを書け。

    -a
    アルファベット(isalphaが真を返す文字)の総文字数
    -d
    数字(isdigitが真を返す文字)の総文字数
    -p
    区切り文字(ispunctが真を返す文字)の総文字数

    複数の値を出力する場合は、空白区切で一行で出力し、順序は上記のとおりとする。

    1. 入出力にC標準ライブラリのgetcharputcharを使用せよ。

    2. 入出力にUNIXシステムコールのreadwriteを使用せよ。

    ヒント
    aもbもprintfは使用不可だがsnprintfは使用可。

奈良女子大学生活環境学部情報衣環境学科生活情報通信科学コース
数学科出身だけどプログラミングを教えている人