前へ | 次へ | 目次 | 索引 |
オブジェクトの配列をその場でソートします。クイック・ソート・アルゴリズムをインプリメントしています。
#include <stdlib.h>関数バリアント qsort関数は,それぞれ 32 ビットと 64 ビットのポインタ・サイズで使用するための _qsort32と _qsort64という名前のバリアントを持っています。ポインタ・サイズ固有の関数の使用方法については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 1.10 節を参照してください。void qsort (void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *));
base
配列の最初のメンバへのポインタ。このポインタは要素へのポインタ型で,文字へのポインタ型にキャストされていなくてはなりません。nmemb
配列の中のオブジェクトの数。size
オブジェクトのサイズ (バイト数)。compar
比較関数へのポインタ。
compar がポイントしている比較関数には,2 つの引数が渡されます。この 2 つの引数は,比較されるオブジェクトをポイントしています。第 1 引数が第 2 引数よりも小さい場合,等しい場合,および大きい場合に,比較関数はそれぞれ 0 よりも小さい整数,0,および 0 よりも大きい整数を返します。比較関数 compar は,すべてのバイトを比較する必要はないので,オブジェクトには比較する値に加えて任意のデータを格納することができます。
比較の結果,等しいと見なされる 2 つのオブジェクトの出力順序は予測不可能です。
指定されたソフトウェア・シグナルを発生させます。シグナルを生成すると, signal, ssignal,または sigvec関数によって設定されたアクション・ルーチンが呼び出されます。
#include <signal.h>int raise (int sig); (ANSI C)
int raise (int sig[, int sigcode]); (HP C Extension)
sig
生成するシグナル。sigcode
オプションのシグナル・コード。 strict ANSI C モードでコンパイルしていない場合にのみ使用できます。たとえば,シグナル SIGFPE ( 算術トラップ・シグナル ) は,それぞれ異なるタイプの算術トラップを表す 10 種類のコードを持っています。シグナル・コードは,ニーモニックまたは番号で表すことができます。算術トラップ・コードは 1 〜 10 の番号で表現され, SIGILL コードは番号 0 〜 2 で表現されます。コード値は <signal.h>ヘッダ・ファイルに定義されています。シグナルのニーモニック,コード,および対応する OpenVMS 例外のリストについては,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』表 4-4 および表 4-5 を参照してください。
raise関数を呼び出すと,以下のいずれかの結果が生じます。
- raiseが <signal.h>ヘッダ・ファイルに定義されている範囲外の sig 引数を指定していた場合, raise関数は 0 を返し, errno変数は EINVAL に設定される。
- signal, ssignal, または sigvecがシグナルの SIG_DFL( デフォルト・アクション ) を設定している場合,関数は返らない。イメージは,シグナルに対応する OpenVMS エラー・コードで終了する。
- signal, ssignal, または sigvecがシグナルのアクションとして SIG_IGN( シグナルを無視 ) を設定している場合, raiseは引数 sig を返す。
- signal, ssignal, または sigvecは,シグナルのアクション関数を設定しなくてはならない。その関数が呼び出され,その戻り値が raiseから返される。
シグナル処理の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4 章を参照してください。
gsignal, signal, ssignal,および sigvecも参照してください。
0 成功。 ゼロ以外 失敗。
0〜231 - 1 の範囲の擬似乱数を返します。
#include <math.h>int rand (void);
int rand_r (unsigned int seed); (Alpha only)
seed
初期シードの値。
rand関数は,少なくとも 232 の周期で, 0 〜 {RAND_MAX} の範囲の擬似乱数整数のシーケンスを算出します。rand_r関数は, 0 〜 {RAND_MAX} の範囲の擬似乱数整数のシーケンスを算出します。 {RAND_MAX} マクロの値は,少なくとも 32767 です。
seed が指すオブジェクトの初期値が同じ状態で rand_rが呼び出され, rand_rから戻って次に呼び出すまでの間にそのオブジェクトを変更していない場合は,同じシーケンスが生成されます。
srandも参照してください。
他の乱数アルゴリズムについては, randomと,すべての * 48関数を参照してください。
n 擬似乱数です。
よりランダムなシーケンスの擬似乱数を生成します。
#include <stdlib.h>long int random (void);
random関数は, rand関数と基本的に同じ呼び出しシーケンスと初期化プロパティを持つが,よりランダムなシーケンスを生成する乱数ジェネレータです。 randが生成する下位 12 ビットはパターンとして循環します。しかし, randomが生成するビットはすべてが利用可能です。たとえば, random() &1 はランダムな 2 進値を生成します。random関数は,デフォルトでは整数 31 個のサイズの状態配列を使用する,非線形の,加算的フィードバックの乱数ジェネレータを使用して, 0〜 231-1 の範囲の連続した擬似乱数を返します。この乱数ジェネレータの周期は,約 16*( 231-1 ) です。乱数ジェネレータの周期は,状態配列のサイズによって決定されます。状態配列のサイズを増やすと,周期も増えます。
256 バイトの状態情報では,乱数ジェネレータの周期は 269 よりも大きくなり,ほとんどの用途に十分です。
rand関数と同様に, random関数はデフォルトでは,シードとして 1 の値を使って srandom関数を呼び出すことで複製できる数のシーケンスを生成します。 srandom関数は, srand関数とは異なり,使用される状態情報の量が 1 ワードよりも多いため,古いシードを返しません。
rand, srand, srandom, setstate, および initstateも参照してください。
n 乱数です。
raw モードは,Curses 入力ルーチンの [w]getchと [w]getstrでしか動作しません。 raw モードは,UNIX I/O,ターミナル I/O,および標準 I/O の HP C RTL エミュレーションではサポートされていません。
#include <curses.h>raw()
noraw()
raw モードの読み込みは,次の 2 つの条件のうちのどちらかで満たされます。ターミナルに一定の文字数 (5) が入力された後,またはターミナルから文字を受信してから一定の時間 (10 秒) が経った後です。
/* Example of standard and raw input in Curses package. */ #include <curses.h> main() { WINDOW *win1; char vert = '.', hor = '.', str[80]; /* Initialize standard screen, turn echo off. */ initscr(); noecho(); /* Define a user window. */ win1 = newwin(22, 78, 1, 1); leaveok(win1, TRUE); leaveok(stdscr, TRUE); box(stdscr, vert, hor); /* Reset the video, refresh(redraw) both windows. */ mvwaddstr(win1, 2, 2, "Test line terminated input"); wrefresh(win1); /* Do some input and output it. */ nocrmode(); wgetstr(win1, str); mvwaddstr(win1, 5, 5, str); mvwaddstr(win1, 7, 7, "Type something to clear screen"); wrefresh(win1); /* Get another character then delete the window. */ wgetch(win1); wclear(win1); mvwaddstr(win1, 2, 2, "Test raw input"); wrefresh(win1); /* Do some raw input 5 chars or timeout - and output it. */ raw(); getstr(str); noraw(); mvwaddstr(win1, 5, 5, str); mvwaddstr(win1, 7, 7, "Raw input completed"); wrefresh(win1); endwin(); }
ファイルからバイトを読み込み,それらをバッファに格納します。
#include <unistd.h>ssize_t read (int file_desc, void *buffer, size_t nbytes); (ISO POSIX-1)
int read (int file_desc, void *buffer, int nbytes); (Compatability)
file_desc
ファイル記述子。指定されるファイル記述子は,現在読み込みのためにオープンされているファイルを参照していなくてはなりません。buffer
入力データが格納される連続したストレージのアドレス。nbytes
読み込み操作に関わるバイト数の上限。
read関数は,読み込んだバイトの数を返します。戻り値は必ずしも nbytes に等しくはなりません。たとえば,入力がターミナルからである場合には,たかだか 1 行分の文字しか読み込まれません。
注意
read関数はレコード・ファイルの中のレコード境界を越えないため,たかだか 1 つのレコードしか読み込みません。各レコードに対し,個別に読み込みを行う必要があります。
n 読み込まれたバイト数。 - 1 読み込みエラーを示します。物理的な入力エラー,不正なバッファ・アドレス,保護違反,未定義のファイル記述子などの理由が考えられます。
#include <file.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> main() { int fd, i; char buf[10]; FILE *fp ; /* Temporary STDIO file */ /* Create a dummy data file */ if ((fp = fopen("test.txt", "w+")) == NULL) { perror("open"); exit(1); } fputs("XYZ\n",fp) ; fclose(fp) ; /* And now practice "read" */ if ((fd = open("test.txt", O_RDWR, 0, "shr=upd")) <= 0) { perror("open"); exit(0); } /* Read 2 characters into buf. */ if ((i = read(fd, buf, 2)) < 0) { perror("read"); exit(0); } /* Print out what was read. */ if (i > 0) printf("buf='%c%c'\n", buf[0], buf[1]); close(fd); }
ディレクトリ内のエントリを探します。
#include <dirent.h>struct dirent *readdir (DIR *dir_pointer);
int readdir_r (DIR *dir_pointer, struct dirent *entry, struct dirent **result);
dir_pointer
オープン・ディレクトリの dir構造体へのポインタ。entry
指定されたストリームの現在位置にあるディレクトリ・エントリによって初期化される, dirent構造体へのポインタ。result
実行に成功したときに,entry へのポインタが格納される位置。
readdir関数は, dir_pointer によって指定されるディレクトリ・ストリーム内の現在位置にあるディレクトリ・エントリを表す構造体へのポインタを返し,ディレクトリ・ストリームの位置を次のエントリに設定します。ディレクトリ・ストリームの終端に達すると,NULL ポインタを返します。ディレクトリ・エントリは, <dirent.h>ヘッダ・ファイルに定義されている dirent構造体によって記述されます。<dirent.h>ヘッダ・ファイルに定義されている DIR型は,ディレクトリ・ストリームを表します。ディレクトリ・ストリームとは,特定のディレクトリ内のすべてのディレクトリ・エントリの順序付きのシーケンスです。ディレクトリ・エントリはファイルを表します。 readdir関数の操作とは非同期的に,ディレクトリのファイルの削除や追加を行うことができます。
readdir関数から返されるポインタは,同じディレクトリ・ストリームに対する別の readdir呼び出しによって上書きすることができるデータをポイントしています。このデータは,他のディレクトリ・ストリームに対する別の readdir呼び出しによって上書きされることはありません。
直前の opendirまたは rewinddir関数の呼び出しの後に,ディレクトリのファイルが削除または追加された場合,その後の readdir関数の呼び出しでは,そのファイルのエントリが返されない可能性があります。
ディレクトリの終端に達したとき,または無効な seekdir操作を検出したとき, readdir関数は null 値を返します。
無効な位置をシークしようと試みると, readdir関数は,次に呼び出されたときに null 値を返します。その前の telldir関数呼び出しが,その位置を返します。
readdir_r関数は, readdirのリエントラントなバージョンです。 dir_pointer に加えて,指定されたストリームの現在のディレクトリ・エントリが返される dirent構造体へのポインタを指定する必要があります。
操作が成功した場合, readdir_rは 0 を返し, result に次の 2 つのうちのどちらかのポインタを格納します。
- エントリが発見された場合には,entry へのポインタ
- ディレクトリ・ストリームの終端に達した場合には,NULL ポインタ
エラーが発生した場合には,エラーの原因を示すエラー値が返されます。
entry がポイントするストレージは,少なくとも NAME_MAX + 1 個の要素を含んだ char d_nameメンバの配列を含んでいる direntに十分な大きさでなくてはなりません。
例については, closedirの説明を参照してください。
x readdir の実行が成功した場合には, struct dirent 型のオブジェクトへのポインタ。 0 readdir_r の実行が成功しました。 x エラーの場合には,エラー値 ( readdir_r のみ。) NULL エラーが発生したか,ディレクトリ・ストリームの終端に達しました ( readdir_r のみ)。エラーが発生した場合, errno はその原因を示す値に設定されます。
ファイルから読み込みを行います。
#include <sys/uio.h>関数バリアント readv関数は,それぞれ 32 ビットと 64 ビットのポインタ・サイズで使用するための, _readv32と _readv64という名前のバリアントを持っています。ポインタ・サイズ固有の関数の使用方法については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 1.10 節を参照してください。ssize_t readv (int file_desc, const struct iovec *iov, int iovcnt);
ssize_t _readv64 (int file_desc, struct __iovec64 *iov, int iovcnt);
file_desc
ファイル記述子。ファイル記述子は,現在読み込み用にオープンされているファイルを指していなければなりません。iov
入力データが置かれる, iovec構造体の配列。iovcnt
iov 配列のメンバで指定するバッファの数。
readv関数は, readと同等ですが,入力データを,iov 配列のメンバ (iov[0], iov[1],...,iov[iovcnt-1]) で指定される iovcnt 個のバッファに置きます。 iovcnt 引数は,0 より大きく,IOV_MAX 以下であれば有効です。各 iovecエントリは,データを置くメモリ領域のベース・アドレスと長さを指定します。 readv関数は,次に進む前に必ず領域を完全に埋めます。
正常に終了すると, readvは,ファイルの st_atime フィールドをアップデートするよう,マークします。
同期入出力オプションがサポートされている場合は,次の処理が行われます。
O_DSYNC ビットと O_RSYNC ビットが設定されている場合,ファイル記述子に対する読み込み入出力操作は,同期 I/O データ一貫性の完了により定義されているとおりに完了します。
O_SYNC ビットと O_RSYNC ビットが設定されている場合,ファイル記述子に対する読み込み I/O 操作は,同期 I/O ファイル一貫性の完了により定義されているとおりに完了します。
共用メモリ・オブジェクト・オプションがサポートされている場合は,次の処理が行われます。
file_desc が共用メモリ・オブジェクトを指している場合, read関数の結果は未定義です。
通常のファイルの場合,file_desc に対応する,オープン済みのファイル記述子に設定されている最大オフセットを越えるデータ転送は実行されません。
n 読み込んだバイト数。 - 1 読み込みエラーを示します。この関数は,errno に以下のいずれかの値を設定します。
- EAGAIN -- O_NONBLOCK フラグがファイル記述子に設定されていて,プロセスの遅延が発生します。
- EBADF -- file_desc 引数が,読み取り用にオープンされている有効なファイル記述子ではありません。
- EBADMSG -- control-normal モードが設定されている STREAM ファイルの場合に,読み込み待ちのメッセージに制御部が含まれていました。
- EINTER -- シグナルを受信したために読み込み操作が終了し,データは転送されませんでした。
- EINVAL -- file_desc で参照されている STREAM やマルチプレクサが,マルチプレクサからダウンストリームで直接的または間接的にリンクされていました。
または
iov 配列内の iov_len 値の合計が, ssize_t を超えていました。
- EIO -- 物理 I/O エラーが発生しました。
または
制御端末から読み込みを行おうとしているバックグラウンド・プロセスのメンバとなっているプロセスで,プロセスが SIGTTIN シグナルを無視またはブロックしているか,プロセス・グループがオーファンドの状態でした。
- EISDIR -- file_desc 引数がディレクトリを参照していますが,実装では, read , pread ,または readv によるディレクトリの読み込みを許していません。代わりに, readdir 関数を使用してください。
- EOVERFLOW -- ファイルが通常のファイルで, nbyte が 0 より大きい場合に,開始位置が,ファイルの終端よりも前で, file_desc に対応するオープン済みのファイル記述子で指定されている最大オフセット以上でした。
readv 関数は,次の場合に失敗 することがあります。
- EINVAL -- iovcnt 引数が 0 以下,または IOV_MAX より大きい値でした。
前へ | 次へ | 目次 | 索引 |