ファイル入出力と プロセス間通信 \(1\)

Similar documents
slide4.pptx

02: 変数と標準入出力

Microsoft Word - Cプログラミング演習(9)

02: 変数と標準入出力

2006年10月5日(木)実施

全体ロードマップ インターネット電話 音の符号化 ( 信号処理 ) 今日 音の録音 再生 ネットワーク ( ソケット ) プログラミング ファイル入出力 インターネットの基礎 C プログラミング基礎

Prog1_12th

演算増幅器

1 C STL(1) C C C libc C C C++ STL(Standard Template Library ) libc libc C++ C STL libc STL iostream Algorithm libc STL string vector l

C言語におけるファイル入出力の高速化

ファイル入出力と プロセス間通信 \(2\)

計算機プログラミング

Microsoft Word - Cプログラミング演習(10)

ファイルシステム

スライド タイトルなし

ファイル入出力

ファイル入出力

PowerPoint プレゼンテーション

gengo1-12

情報処理演習 B8クラス

C言語講座 ~ファイル入出力編~

Microsoft PowerPoint pptx

Microsoft PowerPoint - CproNt11.ppt [互換モード]

Microsoft PowerPoint - 第3回目.ppt [互換モード]

memo

gengo1-12

Microsoft PowerPoint - kougi9.ppt

PowerPoint プレゼンテーション

Microsoft PowerPoint - kougi6.ppt

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Taro-ファイル処理(公開版).jtd

mstrcpy char *mstrcpy(const char *src); mstrcpy malloc (main free ) stdio.h fgets char *fgets(char *s, int size, FILE *stream); s size ( )

Microsoft PowerPoint - 14th.ppt [互換モード]

gengo1-12

プログラミング基礎

Microsoft PowerPoint - 10Com2.ppt

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

Microsoft PowerPoint - guidance.ppt

オペレーティングシステム 2014

PowerPoint プレゼンテーション

ゲームエンジンの構成要素

04-process_thread_2.ppt

PowerPoint プレゼンテーション

A/B (2018/10/19) Ver kurino/2018/soft/soft.html A/B

Microsoft Word - no204.docx

Microsoft PowerPoint - kougi4.ppt

PowerPoint Presentation

プログラミング演習3 - Cプログラミング -

Taro-ポインタ変数Ⅰ(公開版).j

PowerPoint プレゼンテーション

Microsoft PowerPoint - kougi8.ppt

PowerPoint プレゼンテーション

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

AquesTalk2 Win マニュアル

Microsoft Word - 06

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

プログラミング演習3 - Cプログラミング -

Microsoft PowerPoint - dev1.ppt

※ ポイント ※

PowerPoint プレゼンテーション

PowerPoint Presentation

AquesTalk Win Manual

Microsoft PowerPoint - 11.pptx

V

Microsoft PowerPoint - prog06.ppt

memo

データ構造

Original : Hello World! (0x0xbfab85e0) Copy : Hello World! (0x0x804a050) fgets mstrcpy malloc mstrcpy (main ) mstrcpy malloc free fgets stream 1 ( \n

メモリ管理

Microsoft PowerPoint - kougi2.ppt

02: 変数と標準入出力

AquesTalk プログラミングガイド

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

ポインタ変数

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

02: 変数と標準入出力

Cプログラミング1(再) 第2回

プログラミング実習I

Microsoft PowerPoint - 計算機言語 第7回.ppt

02: 変数と標準入出力

ディジタル信号処理

ポインタ変数

Microsoft PowerPoint - prog04.ppt

Microsoft PowerPoint ppt

: CR (0x0d) LF (0x0a) line separator CR Mac LF UNIX CR+LF MS-DOS WINDOWS Japan Advanced Institute of Science and Technology

1. ファイルにアクセスするには ファイルにアクセスするには 1. ファイルを開く 2. アクセスする 3. ファイルを閉じるという手順を踏まなければなりません 1.1. ファイルを読み込む まずはファイルの内容を画面に表示させるプログラムを作りましょう 開始 FILE *fp char fname

ファイル操作-バイナリファイル

プログラミング及び演習 第1回 講義概容・実行制御

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Microsoft PowerPoint - 5Chap15.ppt

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

02: 変数と標準入出力

数値計算

C言語入門

目次

ディジタル信号処理

02: 変数と標準入出力

Microsoft PowerPoint pptx

AquesTalk2 Win マニュアル&ライセンス規定

Transcription:

ファイル入出力と プロセス間通信 (1) 2004 年 12 月 10 日 海谷治彦 1

目次 まずはマニュアルをみよう. 2 章システムコールインタフェース 3 章汎用関数定義 アンバッファー化入出力 (Unbuffered I/O) open, read, write... lseek, dup... 標準入出力ライブラリ fopen, fscanf, fprintf... 標準入力, 標準出力, 標準エラー stdin, stdout, stderr 汎用ポインタ, システムデータ型 void*, size_t, pid_t 等 2

Linux オンラインマニュアル いまさらですが システムコールは 2 章, ライブラリ関数は主に 3 章, コマンドは 1 章にあります. プログラマから見れば, システムコール ( 正確にはシステムコールインタフェース ) もライブラリも単なるライブラリ関数です. しかし,OS の観点からは結構違うことを既に理解してると思います. わかっている人にしかわからないような不親切な記述が多いですが, それでもがんばって読んで. 3

1 章コマンド 4

2 章システムコール 5

システムコールとライブラリの違い システムコール ( インタフェース ) カーネル (OS) に処理を依頼する. ユーザーモードでは直接扱えないハードウェア等の資源へのアクセスを依頼する. ライブラリ関数 カーネルに処理依頼の必要がない処理. 例えば,strlen() 等. システムコールのラッパー open() に対する fopen() や,read() に対する fscanf() 等. 6

データがデバイスに届くまで ユーザープロセス write() 等 fprintf() 等 カーネル sync(), fsync() 等で同期 バッファ write() 等 キャッシュ ディスク等 fflush() 等で同期 7

何段かのコピー 前スライドのように, データが物理的に記録されるまで, 何段かのコピーを作っている. 加えて,CPU 側でさらにキャシュしている場合もある. 少なくとも, 標準入出力関数を使うより, システムコールを使ったほうがコピー回数が少ない. しかし, 一般に標準入出力関数のほうが使い勝手が良い場合が多い. 書式設定等ができるなど. 8

ファイル関係のシステムコール intopen(const char *pathname, int flags); ファイルを開ける関数, いいかえれば, プロセスがファイルを操作可能な状態にする関数. ファイルディスクリプタを返す. ssize_t read(int fd, void *buf, size_t count); 読む関数. ssize_twrite(int fd, const void *buf, size_t count); 書く関数 9

シーケンシャルアクセス read もしくは write を行う場合,( 後述の lseek 等を使わなければ,) ファイルの中身を順次アクセスしかできない. 読みきった部分には戻れない. よってファイルの後戻りをしたい場合, プログラム内に配列等として読み込んでおく. lseek で読み位置を戻す. ただし, どんなファイルでも戻せるわけじゃない. のどちらかの対処が必要. 10

ファイル ディスクリプタ File Descriptor, 値は自然数値 (0, 1, 2...) 実体は, カーネル内にある file 構造体のインスタンスを指している. file 構造体が保持している情報として重要なのは, ファイル内の次に処理を行われる位置 複数のファイルディスクリプタで同一の file 構造体のインスタンスを指すことができる. 異なるファイルディスクリプタ番号で同じファイルを操作できる. さらに, 異なるプロセスが 1 つの file 構造体を共有することもできる. 11

概念図 ( 全部カーネルの中 ) task_struct 構造体 file 構造体のインスタンス files_struct 構造体 メンバー変数 fd 0 1 2 3 4 file 構造体のインスタンス file 構造体のインスタンス 12

lseek と dup off_t lseek(int fildes, off_t offset, int whence) 特定のファイルディスクリプタの現在の読み出し位置を変更する. ファイルを配列のようにランダムアクセスできる感じ. 読み位置を変更できないファイルもある.( パイプ等 ) intdup(int oldfd) ファイルディスクリプタの複製を作る. 要は前ページの赤字の状態を作る. 新たに利用されるディスクリプタの値は使っていない最小値となることが保障されている. 13

file 構造体の共有を例示 main(){ int newfd; char buf[100]; // 標準入力を dup で複製 if((newfd=dup(0))<0) exit(1); // dup fail. fprintf(stderr, "%d is duplicated. n", newfd); // 複製した方で読み位置を進めて見る if((int)lseek(newfd, 200, SEEK_CUR)<0) exit(2); // seek fail. // 複製もとの 0 から値を読んで, 標準出力に表示すると, read(0, buf, 100); write(1, buf, 100); // 先頭からではなく, // さっき 200B 進めた位置から 100B 表示される. } 14

データがデバイスに届くまで 再録 ユーザープロセス write() 等 fprintf() 等 カーネル sync(), fsync() 等で同期 バッファ write() 等 キャッシュ ディスク等 fflush() 等で同期 15

sync() と fsync() ともに, カーネル内のキャッシュを実際のディスク等の装置に書き戻すシステムコール. 無論, カーネルは定期的にこれらを実行しているが, 気になる人はアプリケーションから呼び出してもよいだろう. sync() 等をする前に OS やマシンが異常終了 ( 例えば停電 ) すれば, 無論, データは飛んでしまう. 16

標準入出力関数 fopen, fprintf, fscanf 等, お馴染みの関数群. これらはストリーム ( データの流れ, というか列 ) に対する操作が中心となる. しかし, 最大の特徴はバッファリング (buffering) である. 17

バッファリング (buffering) 前述の図のように, いきなり read/write システムコールを呼び出すのではなく, 記憶領域 ( コレのことを buffer と呼ぶ ) にデータをある程度溜め込んでから入出力を行うこと. 結果としてシステムコールの呼び出し回数を減らすことができ, プログラムを効率化できる. しかし, 現実には 書いたつもりのデータがすぐに書かれない 等が起こり, プログラマには悩みの種.( かも ) 18

三種類のバッファリング 完全なバッファリング バッファーのサイズ ( マクロ BUFSIZ で規定 ) 一杯に buffering をする. ディスク上のファイルはこの方式がデフォルト. 行バッファリング 改行がくるか buffer サイズを超えるまで buffering をする. 端末装置とつながっている場合, この方式をとる. stdin, stdout は通常コレ. アンバッファド buffering をしない. 可能な限り速やかに入出力を行う. stderr は通常コレ. 無論, システムコール呼び出しは頻繁になる. 19

バッファリング方式の変更 setbuf, setvbuf 関数 ( システムコールでは無論ない ) で, バッファリング方式を変更できる. 以下の例では stdout を強制的に完全バッファリングにしている. 結果として,getchar() で文字を読んだあとの printf 命令が実行されるまで,Hello は出力 ( 表示 ) されない. #include <stdio.h> main(){ setvbuf(stdout, NULL, _IOFBF, BUFSIZ); printf("hello "); getchar(); printf("world %d n", BUFSIZ); } 20

ファイルディスクリプタとストリーム FILE *fdopen (int fildes, const char *mode) を用いて, ディスクリプタからストリームを生成することができる. すなわち, ディスクリプタに使いやすい皮をかぶせることができる. fopen で開けられない特殊なファイル ( 通信装置等 ) を使いやすくする際に用いられるらしい. int fileno( FILE *stream) 逆にストリームからディスクリプタを得ることもできる. 21

ストリームの読書き 数えられないくらい関数があるのはご存知の通り. 読み用 fscanf, fgets, fgetc, fread... 書き用 fprintf, fputs, fputc, fwrite... バイナリファイルとテキストファイルの扱い等, 微妙に異なる場合があるので厄介なことがある. read, write システムコールの場合, バイナリ, テキストの区別はない. 22

ストリームの位置決め (1) long ftell( FILE *stream) 現在の読み位置 int fseek( FILE *stream, long offset, int whence) 特定位置まで移動させる.lseek に対応する. しかし, テキストファイルでは多少問題があるらしい. void rewind( FILE *stream) 先頭までまき戻す. これは結構よく見る. 23

ストリームに位置決め (2) int fgetpos( FILE *stream, fpos_t *pos) 現在位置を *posに保存. あとでfsetposで使う. int fsetpos( FILE *stream, fpos_t *pos) *pos で指定された位置に移動する. 上記のほうが (1) のよりお勧めらしい. 24

使い分けについて read, write と fprintf, fscanf を混ぜて使うことは不可能ではない. しかし, バッファリング問題もあり, わけわかんなくなるので,1 つの入出力先ではどちらかに統一したほうが良いだろう. アプリケーション寄りのものは標準入出力関数を用いて, システム寄りはシステムコールを使うのが一般的か 25

汎用ポインタとシステムデータ型 汎用ポインタ void* どの型のポインタにもマッチする ( 明示的にキャストしなくていい ) ポインタ. 結果としてメモリを扱う関数では char* にかわり使われるようになった. システムデータ型なんとか _t 実体は int や long 等なのだが, ソースコードの移植性をよくするために, 昨今では使われる. sys/types.h に主に定義されているようだ. ssize_t, pid_t, fpos_t 等. 26