OpenVMS
HP C ランタイム・ライブラリ・
リファレンス・マニュアル (下巻)


前へ 次へ 目次 索引



qsort

オブジェクトの配列をその場でソートします。クイック・ソート・アルゴリズムをインプリメントしています。

形式

#include <stdlib.h>

void qsort (void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *));

関数バリアント qsort関数は,それぞれ 32 ビットと 64 ビットのポインタ・サイズで使用するための _qsort32_qsort64という名前のバリアントを持っています。ポインタ・サイズ固有の関数の使用方法については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 1.10 節を参照してください。

引数

base

配列の最初のメンバへのポインタ。このポインタは要素へのポインタ型で,文字へのポインタ型にキャストされていなくてはなりません。

nmemb

配列の中のオブジェクトの数。

size

オブジェクトのサイズ (バイト数)。

compar

比較関数へのポインタ。

説明

compar がポイントしている比較関数には,2 つの引数が渡されます。この 2 つの引数は,比較されるオブジェクトをポイントしています。第 1 引数が第 2 引数よりも小さい場合,等しい場合,および大きい場合に,比較関数はそれぞれ 0 よりも小さい整数,0,および 0 よりも大きい整数を返します。

比較関数 compar は,すべてのバイトを比較する必要はないので,オブジェクトには比較する値に加えて任意のデータを格納することができます。

比較の結果,等しいと見なされる 2 つのオブジェクトの出力順序は予測不可能です。


raise

指定されたソフトウェア・シグナルを発生させます。シグナルを生成すると, 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関数を呼び出すと,以下のいずれかの結果が生じます。

シグナル処理の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4 章を参照してください。

gsignal, signal, ssignal,および sigvecも参照してください。


戻り値

0 成功。
ゼロ以外 失敗。


rand, rand_r

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 擬似乱数です。


random

よりランダムなシーケンスの擬似乱数を生成します。

形式

#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 乱数です。


[no]raw

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(); 
} 


read

ファイルからバイトを読み込み,それらをバッファに格納します。

形式

#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); 
}                                                           


readdir, readdir_r

ディレクトリ内のエントリを探します。

形式

#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 がポイントするストレージは,少なくとも NAME_MAX + 1 個の要素を含んだ char d_nameメンバの配列を含んでいる direntに十分な大きさでなくてはなりません。


例については, closedirの説明を参照してください。


戻り値

x readdir の実行が成功した場合には, struct dirent 型のオブジェクトへのポインタ。
0 readdir_r の実行が成功しました。
x エラーの場合には,エラー値 ( readdir_r のみ。)
NULL エラーが発生したか,ディレクトリ・ストリームの終端に達しました ( readdir_r のみ)。エラーが発生した場合, errno はその原因を示す値に設定されます。


readv (Alpha only)

ファイルから読み込みを行います。

形式

#include <sys/uio.h>

ssize_t readv (int file_desc, const struct iovec *iov, int iovcnt);

ssize_t _readv64 (int file_desc, struct __iovec64 *iov, int iovcnt);

関数バリアント readv関数は,それぞれ 32 ビットと 64 ビットのポインタ・サイズで使用するための, _readv32_readv64という名前のバリアントを持っています。ポインタ・サイズ固有の関数の使用方法については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 1.10 節を参照してください。

引数

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 より大きい値でした。


前へ 次へ 目次 索引