ホームページへ戻る
 

上へ戻る
 

  C言語入門  その2  Linuxプログラミング 
by H.Y 3月 2 22:22:52 JST 2002


目次:
1。Linuxのファイル構造
1ー1。ディレクトリ
1ー2。デバイスファイル
1)/dev/console
2)/dev/tty
3)/dev/null
1ー3。システムコールとデバイスドライバ
1)システムコールとデバイスドライバの関係
3)デバイスドライバにアクセスするシステムコール
1ー4。ライブラリ関数
2。低水準ファイルアクセス
2ー1。ファイルディスクリプタ
2ー2。 open
2ー2。 close
2ー3。 read chap3 read.c
2ー4。 write chap3 write.c
2ー5。 ioctl
2ー6。ファイル操作のその他のシステムコール
1) lseek
2) fstat, stat, lstat
3) dup, dup2
3。標準入出力ライブラリ
3ー1。fopen
3ー2。fread
3ー3。fwrite
3ー4。fclose
3ー5。fflush
3ー6。fseek
3ー7。fgetc, getc, getchar
3ー8。fgets, gets
3ー9。fputc, putc, putchar
3ー10。fputs, puts
4。書式付き入出力
4ー1。printf, fprintf, sprintf
(1)変換指定子
(2)フィールド指定子
4ー2。scanf, fscanf. sscanf
5。ストリームのエラー
5ー1。 errno
5ー2。ferrno, feof, clearerr, fileno
6。端末の制御
6ー1。カノニカルモード(canonical mode/)/ノンカノニカルモード
6ー2。termios 構造体
1)tcgetattr() ,tcsetattr()
2) optional_actions
3)入力フラグ(c_iflag)
4)出力フラグ(c_oflag)
5)フラグ c_cflag
6)フラグ c_lfalg
6ー3。シェルによる端末モードへのアクセス
1) setty -a
2) setty sane
3) setty -g save_setty
4) setty $(cat save_setty)
5) setty -icanon min 1 time 0
6) setty -echo
7) setty echo
6ー4。演習
1)パスワードを入力するサンプルプログラムを作る。password.c
2)文字単位の読み取りを実行するサンプルプログラム menu4.c
3) キイ読み取りプログラム kbhit.c
4)シリアル端末を使った送信/受信プログラム

-----------------------------------------------------

1。Linuxのファイル構造
UNIX環境では、ディスクファイルやシリアルポート、プリンタその他の
デバイスは全てファイルとしてプログラム上から扱う。ディレクトリも
特殊ファイルである。したがっ てこれらのファイルに対する操作で必要な
のものは open, close, read, write, ioctl の5つの操作関数のみである。
1ー1。ディレクトリ
ファイルはデータの他に管理管理情報を持っている。この管理情報は
iノードに格納され、iノードはファイルの日時情報とパーミッション
情報、ファイルの長さ、ディスク上のファイルの位置に関する情報も含ま
れている。システムが使用するのはこのiノード番号である。
ディレクトリとは他のファイルのiノードと名前を保持しているファイ
ルのことである。
1ー2。デバイスファイル
1)/dev/console
これはシステムのコンソール。エラーメッセージや診断情報はこの
デバイスに送られる。
2)/dev/tty
特別なファイル/dev/ttyはプロセスが制御端末(キイボード、画面)
を持っている場合の制御端末のエイリアス(論理デバイス)です。
/dev/ttyを介してアクセスできる物理デバイスは複数多数存在する。
3)/dev/null
ヌルデバイスである。このデバイスに書きこまれた情報は全て破棄さ
れる。
/dev/zero は nullバイトのみを返すデバイス。
このファイルを読み取るとすぐにEOFが返される。
例1: dd if=/dev/zero of=all-zero count=512
all-zero は 全て null のサイズ 512バイト のファイル
例2: dd if=/dev/null of=all-null count=512
all-null はサイズ 0 のファイル
1ー3。システムコールとデバイスドライバ
1)システムコールとデバイスドライバの関係
オペレーティングシステムとのインターフェイスがシステムコール。
デバイスドライバはハードウェアを制御するための低水準インターフェ
イスの集合。このデバイスドライバにアクセスするために低水準関数
(システムコール)が用意されている。
デバイスドライバはどのデバイスに対しても共通したインターフェイ
スを提供するために、全てのハードウェア依存機能をカプセル化してい
る。このハードウェア特有の機能は一般に ioctl() を通じて利用できる。
3)デバイスドライバにアクセスするシステムコール
(1) open
(2) close
(3) read
(4) write
(5) ioctl
ioctl はデバイス固有の制御を行うのに使用するので、デバイス
毎に異なる。
1ー4。ライブラリ関数
入出力のための低水準システムコールは、効率が良くない。
システムコールを実行すると、一度ユーザーコードからカーネルコード
へ切替えられる。その後再びユーザーコードへ切替えられる。
デバイスとディスクファイルに対する高水準のインターフェイスが
標準入出力ライブラリである。
例: fopen , fclose , fread, fwrite 他

2。低水準ファイルアクセス
2ー1。ファイルディスクリプタ
ファイルディスクリプタはオープンしたデバイスやファイルをアクセス
する時に使う整数値のこと。通常、プログラムを実行すると、次の3つの
ファイルはすでにオープンされている。
0 : 標準入力
1 : 標準出力
2 : 標準エラー
2ー2。 open
新しいファイルディスクリプタを作成するには、open システムコール
を使う。
-------------------------------------------------------------
#include <fcnt.h>
#include <sys/types.h>
#include <sys/stat.h>

int open(const char *path, int oflags);
int open(const char *path, int oflags, mode_t mode);
------------------------------------------------------------
open はファイルまたはデバイスへのアクセスパスを確立する。
open に成功すると、ファイルディスクリプタを返す。
失敗した場合は -1 をかえす。
1つのファイルを2つのプログラムで使用する場合は2度openする。

open は常に未使用の最小のファイルディスクリプタを返す。
close(1) を実行した後 open すると 標準出力が割り当てられる。

(1) oflags のファイルアクセスモード
O_RDONLY : 読み込み専用
O_WRONLY : 書き込み専用
O_RDWR : 読み書き用
(2) oflags の省略可能なモード
O_APPEND : 書き込みデータをファイルの最後に追加する
O_TRUNC : ファイルの長さを 0 に切り詰める。
O_CREAT : 必要に応じ、mode 指定のパーミッションでファイルを
作成する。
O_EXCL : O_CREATと共に指定された場合、すでにファイルが存在
する場合は失敗する。同じファイルを2度作成しない
ために用いる。
(3) mode
S_IRUSR : オーナーの読み取り権
S_IWUSR : オーナーの 書き込み権
S_IXUSR : オーナーの実行権

S_IRGRP : グループの読み取り権
S_IWGRP : グループの書き込み権
S_IXGRP : グループの実行権

S_IROTH : 他のユーザの読み取り権
S_IWOTH : 他のユーザーの書き込み権
S_IXOTH : 他のユーザーの実行権
これらのフラグはビット指定なので | で複数設定できる。
例: open("myfile", O_CREATE, S_IRUSR | S_IXOTH);

2ー2。close
-----------------------------------------------
#include <unistd.h>

int close(fd);
----------------------------------------------
成功した場合は 0 、失敗した場合は -1 を返す。

2ー3。read
-------------------------------------------------------
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
------------------------------------------------------
read() は ファイル・ディスクリプター fd から最大 count
バイトを buf で始まるバッファーへ読み込もうとする。

count がゼロならば、read() はゼロを返し他に何も 起 き な い。
count が SSIZE_MAX より大きければ、結果は特定できない。

返り値
成功した場合、読み込んだバイト数を返す(ゼロはファイルの終りを意味
する)。この数が要求した数より小さい場合もある。
エラーの場合は、-1 が返され、 errno が適切に設定される。
例題:-------- read.c ---------------------------
#include <unistd.h>

int main(){
char chrs[]={"読み込み成功です。\n"};
char chws[]={"書き込み成功です。\n"};
char buffer[128];
int nread;

nread = read(0, buffer, 128);
if (nread == -1)
write(2, "A read error has occurred\n", 26);
write(2, chrs,sizeof(chrs));

if ((write(1,buffer,nread)) != nread)
write(2, "A write error has occurred\n",27);
write(2, chws,sizeof(chws));

exit(0);
}
----------------------------------------------
read "メッセージ" を実行する。

2ー4。write
man 2 write でマニュアルを表示する。
--------------------------------------------------------
#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);
-------------------------------------------------------
write は buf で示されるバッファーから最大 count バイトまで
をファイル・ディスクリプター fd によって参照されるファイル
へと書き込む
成 功した場合には、書き込まれたバイト数が返される(ゼロは何
も書き込まれなかったことを示す)。
エラーならば -1 が 返 される。
例題:--------- write.c ------------------------
#include <unistd.h>

int main(){
char ch[]={"書き込みのテストです。\n"};
char cherr[]={"書き込みエラーです。デスクリプタ 1\n"};

if ((write(1, ch, sizeof(ch))) != sizeof(ch))
write(2, cherr,sizeof(cherr));

exit(0);
}
----------------------------------------------
write を実行する。

2ー5。ioctl
--------------------------------------------------------
#include <sys/ioctl.h>

int ioctl(int d, int request, ...)
-------------------------------------------------------
ioctl はディスクリプタ d で指定したオブジェクトに対して,cmd で
指定した機能を実行する。デバイスの機能により3番目のパラメータ
が必要な場合がある。
成功した場合はゼロが返される。エラーの場合は -1 が返され、
errno が適切に設定される。

2ー6。ファイル操作のその他のシステムコール
1) lseek
---------------------------------------------------
#include <unistd.h>
#include <sys/types.h>

off_t lseek(int fd, off_t offset, int whence);
--------------------------------------------------
ファイルの読み書きを行うポイントを設定する。
offset は位置を指定、whence は offset の意味を指定。
whence
SEEK_SET : offset は絶対位置
SEEK_CUR : offset は現在の位置からの相対位置
SEEK_END : offset はファイルの最後からの相対位置
成功した場合は、指定しているオフセットを、ファイルの先頭
からのバイト数で返す。失敗した場合は -1 を返す。

2) fstat, stat, lstat man 2 stat でマニュアル表示のこと。
fstat は、オープンされたファイルディスクリプタに関連づけられた
ファイルの情報を取得する。
stat 、lstat は指定された名前のファイルの情報を取得する。
lstat はリンクそれ自体の情報を取得する。
3) dup, dup2
ファイルディスクリプタを複製する。

3。標準入出力ライブラリ
標準入出力ライブラリで、低水準ファイルディスクリプタに相当するも
のは、ストリームと呼ばれ、構造体へのポインタ *FILE として実装さ
れています。プログラムを実行すると、
stdin (ファイルスクリプタ 0 に相当)
stdout ( 1 に相当)
stderr ( 2 に相当)
のファイルストリームが時動的にオープンされます。
これらは stdio.h で宣言されている。

3ー1。fopen
----------------------------------------------------
FILE *fopen(const char *filename, const char *mode);
-----------------------------------------------------
filename のファイルをオープンし、ストリームに関連づける。
mode
"r" , "rb" : 読み取り専用でオープン
"w" , "wb" : 書き込用でオープン。もとのファイルサイズを 0
に切り詰める。
"a" , "ab" : 書き込み用でオープンしファイルの最後に追加する。
"r+", "rb+", "r+b":更新(読み書き用でオープン)
"w+", "wb+", "w+b":更新用にオープン。もとのファイルサイズを
0 に切り詰める。
"a+", "ab+", "a+b":更新用にオープンし、ファイルの最後に追加する。
b はバイナリファイルを意味する。
ただし、UNIXでは全てのファイルがバイナリファイルとして処理する。

成功すると、FILE * ポインタを返す。
失敗した場合はNULLポインタを返す。
3ー2。fread
----------------------------------------------------------------
size_t read(void *ptr, size_t size, size_t nmemb, FILE *stream);
-----------------------------------------------------------------
stream ポインタで指定されたストリームから nmemb 個のデータを読み
込み、 ptr で与えられた場所に格納する。個々のデータは size バイト
の長さを持つ。
fread は読み書きに成功した要素の個数(バイト数ではない)を返す。
エラーが生じた場合や、end-of-file(ファイルの最後)に達 し た 場
合、返り値は指定した個数よりも小さい値(またはゼロ)となる。

fread はend-of-fileとエラーを区別しないので、どちらが生 じ
た かを判断するためには、呼び出し側で feof(3) と ferror(3)
とを使用しなければならない。
3ー3。fwrite
--------------------------------------------------------------
size_t fwrite( const void *ptr, size_t size, size_t nmemb,
FILE *stream);
---------------------------------------------------------------
ptr で指定された場所から得た nmemb 個のデータを、 stream ポインタ
で指定されたストリームに書き込む。個々のデータは size バイトの長さ
を持つ。
戻り値は書き込みに成功したレコード数。
3ー4。fclose
-------------------------
int close(FILE *steam);
-------------------------
標準入出力ライブライでは、データはバッファリングされている。
fclose 関数は、指定されたstreamをクローズし、まだ書き込まれいない
データを書き込む。また、プログラムが正常終了した場合は、 fcloseが
自動的に呼び出される。
3ー5。fflush
-------------------------------
int fflush(FILE *stream);
-------------------------------
ファイルストリームにある未処理のデータをただちに書き込む。
3ー6。fseek
----------------------------------------------------
int fseek(FILE *stream, long int offset, int whence);
-----------------------------------------------------
ストリーム上で次に読み書きを行う位置を指定する。
offset と whence は lseek の場合と同じ。
成功した場合は 0 を返す。失敗した場合は -1 を返し errno をセット
する。
3ー7。fgetc, getc, getchar
---------------------------------
#include <stdio.h>

int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);
----------------------------------
fgetc() は stream から次の文字を unsigned char として読 み
int にキャストして返す。ファイルの終りやエラーとなった場合
は EOF を返す。
getc() は fgetc() と同様だが、 stream を複数回評価するマク
ロとして実装されるかもしれない。
getchar() は getc(stdin) と同じである。

fgetc(), getc(), getchar() は文字を unsigned char として読
ん で, int にキャストして返すか、ファイルの終りを EOF とし
て返すか、エラーを返す。
3ー8。fgets, gets
-----------------------------------------------
#include <stdio.h>

char *gets(char *s);
char *fgets(char *s, int size, FILE *stream);
-----------------------------------------------
gets() は stdin から改行文字あるいは EOF (これらは '\0' に
置き換えられる)までの1行を s で示されるバッファに 読 み 込
む。バッファのオーバーランはチェックされない。

fgets() は size よりも1文字以上少ない文字を stream から 読
み込み、 s で示されるバッファに書き込む。読み込みは EOF ま
たは改行文字を読み込んだ後終わる。改行文字は読まれるとバッ
ファに書き込まれる。 '\0' 文字がバッファの中の最後の文字の
後に1文字書き込まれる。

gets() と fgets() は成功すると s を返し、ファイルの終り あ
るいはエラーの場合 NULL を返す。
3ー9。fputc, putc, putchar
-------------------------------------------
#include <stdio.h>

int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
-------------------------------------------
fputc() は、 キャラクタ c を unsigned char にキャストし、
stream に書き込む。

putc() は、 stream を一度以上評価するマクロとして実装され
ているかも知れないという点を除き、 fputc() と同じである。

putchar(c); は、 putc(c,stdout) と同じである。

fputc()、 putc() そして putchar() は unsigned char とし て
書 き込まれた文字を int にキャスして返す。失敗した場合は
EOF を返す。
3ー10。fputs, puts
---------------------------------------------
#include <stdio.h>

int fputs(const char *s, FILE *stream);
int puts(const char *s);
---------------------------------------------
fputs() は、文字列 s を stream に書き込む。文字列 に 続 く
'\0' は出力しない。

puts() は、文字列 s と改行を stdout に書き込む。

puts() と fputs() は、成功すると負ではない数を、エラーが発
生した場合は EOF を返す。

4。書式付き入出力
4ー1。printf, fprintf, sprintf
------------------------------------------------------
#include <stdio.h>

int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
------------------------------------------------------
printf 関数グループは、以下で述べるように、 format に従っ
て出力を生成するものである。
printf は 出 力 をstdout (標 準 出 力 ス ト リ ーム)に
書き出す。
fprintf は与えられた出力を stream に書き出 す。
sprintf, は文字列 str に書き込む。

帰り値は書き込まれた文字の個数を返す。('\0'は含まない)
変換フォーマットは % から始まる。
例: printf("sample No.: %d, %d, and %d\n", 1, 2, 3);
sample No.: 1, 2, and 3
1)変換指定子
%d, %i : 整数を10進数で出力
%o, %x : 整数を8進数、16進数で出力
%c : 文字を出力
%s : 文字列を出力
%f : 浮動小数点(単精度)を出力
%e : 倍精度浮動小数点を出力
%g : 一般的な形式でdoubleを出力

2)フィールド指定子
出力中の文字そろえや、空白の埋め込み方法を指定する。
%10s "Hello" | Hello|
%-10s "Hello" |Hello |
%10d 12345 | 12345|
%-10d 12345 |12345 |
%-10d 12345 |0000012345|
%10.4f 123.45 | 123.4500|
%*s 10, "Hello" | Hello|
3)例 ---------- sprintf1.c -------------------
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv){
char ch[100];
double fdata;

fdata = atof(argv[1]);
sprintf(ch, "%10.4f",fdata);
printf("Input data = %s fdata = %f\n", ch, fdata);

return 0;
}
-----------------------------------------

実行: ./sprintf1 123.4567890
浮動小数点 123.4567890 を 文字列に変換して ch へ代入する。
結果: Input data = 123.4568 fdata = 123.456789

4ー2。scanf, fscanf. sscanf
----------------------------------------------------------
#include <stdio.h>
int scanf( const char *format, ...);
int fscanf( FILE *stream, const char *format, ...);
int sscanf( const char *str, const char *format, ...);
----------------------------------------------------------
scanf 関数グループは、format に従って 入 力を読み込むもの
である。この書式は 変換文字 (conversion specifiers) を含む。
この変換の結果は(もしあれ ば) pointer 引 数 を 通じて保存
される。
scanf 関数は標準入力ストリーム stdin からの入力を読み込む。
fscanf はストリームポイ ン タ stream からの入力を読み込む。
sscanf は文字列ポインタ str で示された文字列からの入力を読
み込む。

scanf 属は読み取った項目数を返す。最初の項目で失敗した場合
は 0 をかえす。

1)変換指定子
%d : 整数を10進数で入力
%u : 符号無し10進数を入力
%i : 整数を入力。
%oi は8進数。%xi は16進数。
%o, %x : 整数を8進数、16進数で入力
%f, %e, %g: 浮動小数点を入力
%c : 指定された数の文字を入力(スペースはスキップされな
い)。長さ指定がないときは1文字(%1c)。
%s : 空白をふくまない文字列を入力
%n : これまで読み込んだ文字数を引数に代入。
%[] : 文字の集合を入力
%% : 文字 % を入力
2)例
(1)---- scanf.c -------------------
#include <stdio.h>
#include <stdlib.h>

int main(){
char c, s[256];
int n;
float f;

scanf("Hello, %d, %g, %c, %[^\n]",&n, &f, &c, s);
// %[^\n] は \nで終了を意味する。 !\n の事。
printf("\n\n");
printf("%d\n%f\n%c\n%s\n",n,f,c,s);

return 0;
}

(1)----- scanf1.c -----------------
int num;
if( scanf("Hello %d", &num) )
printf("num = %d\n", num);
----------------------------------
stdin からの入力の文字が Hello で次の文字が数字の場合に
scanf が成功してプリントアウトされる。数字の前にスペースが
あっても良い。
(2) ------ scanf2.c ---------------------------
#include <stdio.h>
#include <stdlib.h>

int main(){
char c, s[256];
int n, item_number;
float f;

tem_number =
scanf("Hello, %d, %g, %c, %[^\n]",&n, &f, &c, s);
// %[^\n] は \nで終了を意味する。 !\n の事。
printf("\n\n");
printf("%d\n%f\n%c\n%s\n",n,f,c,s);
printf("item_number = %d\n",item_number);

return 0;
}
---------------------------------------------
[^/n] は改行で読みとりを終了することを意味する。
[^,]は 、で読みとりを終了する。
実行:
./scanf2
Hello, 3456, 987.123,T,This is the test string.
結果:
3456 n に代入
987.122986 f に代入
T c に代入
This is the test string. s に代入
item_number = 4 読み取り項目数

5。ストリームのエラー
5ー1。 errno
標準入出力ライブラリの多くの関数はエラーが帰った場合はエラーの
内容を示す値を、システム変数 errno にセットする。
------------------------
#include <errno.h>
extern errno;
------------------------
エラーの内容と整数値の関係は errno.h を参照すること。
5ー2。ferrno, feof, clearerr ,fileno
ストリームにエラーの状態を調べる関数。
-----------------------------------
#include <stdio.h>

int ferror(FILE *stream);
int feof(FILE *stream);
void clearerr(FILE *stream);
int fileno( FILE *stream);
-----------------------------------
1) ferror() エラーがセットされていない場合は 0 を返す。
2) feof() EOF でない場合は 0 を返す。
3) clearerr() EOFそしてエラー インジケータをクリヤーする。
4) fileno() は stream のフィイルディスクリプタを返す。
6。端末の制御
6ー1。カノニカルモード(canonical mode/)/ノンカノニカルモード
端末の入力がリターンキイを押すまで、プログラムから利用できない
モードのこと。DeleteキイやBackSpaceキイで入力を修正できる。
これに対してノンカノニカルモードは、入力文字個々をアプリケーショ
ンから細かく利用できる。
6ー2。termios 構造体
端末を細かく制御するための構造体で termio.h で定義されている。
この構造体で定義されている関数を呼び出すためには、curses もしくは
ncurses ライブリとリンクして用いる。すなわち、コンパイルするとき
に -ncurses もしくは -lncurses をつけてコンパイルする。
---- /usr/include/bits/termios.h ---------------------------
struct termios
{
tcflag_t c_iflag; /* input mode flags */
tcflag_t c_oflag; /* output mode flags */
tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */
cc_t c_cc[NCCS]; /* control characters */
speed_t c_ispeed; /* input speed */
speed_t c_ospeed; /* output speed */
};
-----------------------------------------------------------
1)tcgetattr() ,tcsetattr()
---------------------------------------------------
#include <termios.h>

int tcgetattr(int fd, struct termios *termios_p);
int tcsetattr(int fd, int actions,
struct termios *termios_p);
----------------------------------------------------
tcgetattr() は fd に関するパラメータを取得し、termios_p
が参照する構造体 termios に設定する。
成功したときは 0 、失敗したときは -1 が帰り、errno が
セットされる。

setattr() は 端 末に関連したパラメータを設定する。
設定には termios_p が参照する termios 構造体を用いる。
optional_actions には変更が有効となるタイミングを設定する:

2) optional_actions
(1)TCSANOW : 値をただちに変更する。
(2)TCSADRAIN: 現在の出力が完了した後ただちに変更する。
(3)TCSAFLUSH: 現在の出力が完了した後ただちに変更するが、
受信したがまだ読み込んでいない全ての入力
は破棄される。
3)入力フラグ(c_iflag)
IGNBRK: 入力中のBREAK信号を無視する。
BRKINT: IGNBRK が設定されていない場合は BREAK 信号に対して
SIGINT を発生する。設定されている場合は BREAK を文
字 \0 として読み込む。
IGNPAR: フレームエラーおよびパリティエラーを無視する。
PARMRK: IGNPAR が設定されていない場合は、パリティエラーある
いはフレームエラーの発生した文字の前に\377 \0を付加
する。IGNPAR も PARMRK も設定されていない場合は、パ
リ ティエラーあるいはフレームエラーの発生した文字を
\0として読み込む。
INPCK : 入力のパリティチェックを有効にする。
ISTRIP: 8ビット目を落とす。
INLCR : 入力の NL (New Line: 改行 文 字)を CR (Carriage
Return: 復帰文字) に置き換える。
IGNCR : 入力の CR を無視する。
ICRNL : 入 力の CR を NL に置き換える(IGNCRが設定されていな
い場合)。
IUCLC : 入力の大文字を小文字に置き換える。
IXON : 出力のXON/XOFFフロー制御を有効にする。
IXANY : 任意の文字を受信した時に再出力をおこなう。
IXOFF : 入力のXON/XOFFフロー制御を有効にする。
IMAXBEL: 入力キューが一杯の時にベルを鳴らす。
4)出力フラグ(c_oflag)
OPOST : 実装に依存した出力処理を有効にする。
OLCUC : 出力時に小文字を大文字に変換する。
ONLCR : 出力のNLをCR-NLに置き換える。
OCRNL : 出力のCRをNLに置き換える。
ONOCR : 0桁目でCRを出力しない。
ONLRET: CRを出力しない。
OFILL : 転送時間を遅らせるのでは な く、 補 填 文 字 (fill
character) を送る。 (訳注:特定の文字に対して、端末
側の処理を待つために転送を一定時間遅らせることが で
きる。また、 OFILL を指定すると転送を遅らせる代りに
補填文字を送る。)
OFDEL: 補填文字を ASCII DEL にする。このフラグが設定されて
いない場合は ASCII NUL になる。
NLDLY: NL の遅延を設定する。値は NL0 (遅延なし) および NL1
である。
CRDLY: CR の遅延を設定する。値は CR0 (遅 延 な し), CR1,
CR2,CR3 である。
TABDLY: 水 平 タ ブ (horizontal tab) の遅延を設定する。値
はTAB0 (遅延なし), TAB1, TAB2, TAB3, XTABS である。
XTABSの 値はタブをスペース何個に変換するかを示す(タ
ブは8桁毎に止まる)。
BSDLY : 後退 (backspace) の遅延を設定する。値は BS0 (遅延な
し)あるいは BS1 である。
VTDLY : 垂 直タブ (vertical tab) の遅延を設定する。値は VT0
(遅延なし)あるいは VT1 である。
FFDLY : 頁送り (form feed) の遅延を設定する。値は FF0 (遅延
なし)あるいは FF1である。

5)制御モードフラグ c_cflag
制御モードは主にシリアルラインに対して用いられる。

CSIZE : 文字サイズを設定する。値はCS5, CS6, CS7, CS8 であ
る。
CSTOPB: ストップビットを 1 ではなく 2 にする。
CREAD : 受信を有効にする。
PARENB: 出力にパリティを付加し、入力のパリティチェックを お
こなう。
PARODD: 入力および出力を奇数パリティとする。
HUPCL : 最 後のプロセスがデバイスをクローズした後、モデムの
制御線を low にする (切断する)。
CLOCAL: モデムの制御線を無視する。
CIBAUD: 入力速度を設定する (使われない)。
CRTSCTS: フロー制御。

6)ローカルモードフラグ c_lfalg
最も重要なのは ECHO と ICANON である。

ISIG : INTR, QUIT, SUSP, DSUSP の文字を受信した時、対応 す
るシグナルを発生させる。
ICANON: canonical モ ー ドを有効にする。このモードでは特殊
キャラクタ EOF, EOL, EOL2, ERASE, KILL, REPRINT,
STATUS, WERASE およびラインバッファが有効になる。
XCASE : ICANON が同時に設定された場合、端末は大文字のみが有
効である。入力された文字は \ が付いた文字を除いて小
文字に変換される。出力時は、大文字の前に\が付き、小
文字は大文字に変換される。
ECHO : 入力キャラクタのエコー。
ECHOE : ICANON も同時に設定された場合、ERASE 文字は前の文字
を削除し、 WERASE 文字は前の単語を削除する。
ECHOK : ICANON も同時に設定された場合、KILL 文字は現在の行
を削除する。
ECHONL: ICANON も同時に設定された場合、 ECHO が設定されてい
なくても NL 文字をエコーする。
ECHOCTL:
ECHO も同時に設定された場合、 TAB, NL, START, STOP
の ASCII 制御文字が ^X としてエコーされる。 X は 制
御 文 字より ASCII コードで 0x10 だけ大きな文字であ
る。例えば文字 0x28 (BS) は ^H とエコーされる。
ECHOPRT:
ICANON および IECHO が同時に設定されている場合、 削
除された文字も表示される。
ECHOKE :ICANON も設定された場合、 KILL が行の各文字を消去す
る代わりにエコーされる。これは ECHOE および ECHOPRT
を指定することと等しい。
FLUSHO :出力をフラッシュする。このフラグは DISCARD 文字を入
力することで切替えられる。
NOFLSH :SIGINT, SIGQUIT シグナル発生時の入力・出力キュー の
フラッシュ、および SIGSUSP シグナル発生時の入力キュ
ーのフラッシュを無効にする。
TOSTOP :バックグラウンドプロセスのプロセスグループで制御 端
末 へ 文 字 を 出力しようとしているプロセスに対して
SIGTTOU シグナルを送る。
PENDIN :次の文字を読み込んだ時、入力キュー中の全文字を再 表
IEXTEN :実装依存の入力処理を有効にする。

設定例:
構造体.c_lflag &= ~ICANON; //ICANO 無効
構造体.c_lflag |= ECHO; //ECHO 有効

7)特殊制御文字( c_cc 配列 )
c_cc 配 列 は特殊な制御文字を定義している。シンボルの一覧
(と意味: 初 期 値) は 以 下 の 通 り。
------------------------------------------------------
カノニカルモードの配列の添字
VEOF : (end-of-file character: 004, EOT, Ctrl-D)
VEOL : (additional end-of-line character: 0, NUL)
VERASE: (erase character: 010, BS, Ctrl-H)
VINTR : (interrupt character: 0177, DEL, rubout)
VKILL : (kill character: 025, NAK, Ctrl-U)
VQUIT : (quit character: 034, FS, Ctrl-\)
VSUSP : (suspend character: 032, SUB, Ctrl-Z)
VSTART: (start character: 021, DC1, Ctrl-Q)
VSTOP : (stop character: 023, DC3, Ctrl-S)
-----------------------------------------------------
ノンカノニカルモードの添字
VINTR : (interrupt character: 0177, DEL, rubout)
VMIN L: (additional end-of-line character: 0, NUL)
VQUIT : (quit character: 034, FS, Ctrl-\)
VSUSP : (suspend character: 032, SUB, Ctrl-Z)
VTIME : (yet another end-of-line character: 0, NUL)
VSTART: (start character: 021, DC1, Ctrl-Q)
VSTOP : (stop character: 023, DC3, Ctrl-S)
-----------------------------------------------------
VSWTCH: (switch character: 0, NUL)
VDSUSP: (delayed suspend character: 031, EM, Ctrl-Y)
VLNEXT: (literal next: 026,SYN, Ctrl-V)
VWERASE : (word erase: 027, ETB, Ctrl-W)
VREPRINT: (reprint unread characters: 022, DC2, Ctrl-R)
VDISCARD: (discard pending output: 017, SI, Ctrl-O)
----------------------------------------------------

TIME と MIN はノンカノニカルモードでのみ用いられ、入力の
読み取りを制御する役割をもつ。
(1) MIN = 0 かつ TIME = 0
read は常にただちに戻る。
(2) MIN = 0 かつ TIME > 0
read は、読み取る文字がある場合、または 1/10 秒を単位
としてTIMEで指定された時間が経過した場合に戻る。
(3) MIN > 0 かつ TIME > =0
read は、MINで指定された数の文字数を読み取るまで待ち、
その文字数を返す。ファイルの終りに達した場合は 0 を返す。
設定例:
構造体.cc_c[VMIN] = 1;
構造体.cc_c[VTIME] = 0;
(4) MIN > 0 かつ TIME > 0
read は1文字を受け取るまで待つ。文字を受け取る毎に、
文字間のタイマーがスタートする。read はMINで指定した数
の文字を読み取るか、1/10秒単位のTIMEで指定したタイマー
が切れる、呼び出しか戻る 。



6ー3。シェルによる端末モードへのアクセス
1) setty -a
現在の termios の設定内容を表示。
2) setty sane
端末を標準に戻す。
3) setty -g save_setty
現在の termios の内容をセーブする。
4) setty $(cat save_setty)
端末の設定を save_setty に変更。
5) setty -icanon min 1 time 0
端末を カノニカルモード無効、MIN=1、TIME=0 に設定。
6) setty -echo
端末を エコー無効に設定。
7) setty echo
端末を エコー有効に設定。

6ー4。演習
1)パスワードを入力するサンプルプログラムを作る。password.c
(1)現在の端末の設定を取得しする。
(2)エコーを無効にする。
(3)パスワードの入力メッセージを表示
(4)パスワードを読み取る。
(5)端末の設定をもとにもどす。
(6)パスワードを表示する。
(7終了
2)文字単位の読み取りを実行するサンプルプログラム menu4.c
(1)現在の設定を取得する。
(2)エコーを無効にする。
(3)ノンカノニカルモードにする。
(4)ISIG を無効にする。 Ctrl+C でも終了しないようにする。
(5)選択文字入力をうながす表示
(6)文字を1文字読み取る。
(7)文字が 'q'(9)へ
'1' ー '9'なら 対応するメッセージを表示
(8) (5)に戻る
(9)端末の設定をもとにもどす。
(10)終了
3) キイ読み取りプログラム kbhit.c
キイ入力を1文字づつ読み取り表示する。
'q' キイで終了する。
4)シリアル端末を使った送信/受信プログラム