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


前へ 次へ 目次 索引


互換性を保つために,デバイスの種類にかかわらず, statfstatutime,および utimesの以前の動作はデフォルトのままとなっています。

新しい動作を有効にするためには,アプリケーションを呼び出す前に, DECC$EFS_FILE_TIMESTAMPS 論理名を明示的に "ENABLE" に定義する必要があります。この論理名を設定しても, ODS-2 デバイス上のファイルに対する statfstatutime,および utimesの動作には影響はありません。


戻り値

0 実行に成功しました。
- 1 エラーを示します。ファイルの時刻は変更されず,関数は errno を以下のいずれかの値に設定します。

utimes 関数は,以下の場合に 失敗します。

  • EACCES--- path 接頭辞のコンポーネントで検索許可が拒否された。または, times 引数が NULL ポインタで,プロセスの実効ユーザ ID がファイルのオーナと一致せず,書き込みアクセスが拒否された。

  • ELOOP--- path を解決する過程で検出したシンボリック・リンクの数が多すぎた。

  • ENAMETOOLONG--- path 引数の長さが {PATH_MAX} を超えた, pathname コンポーネントが {NAME_MAX} よりも長かった,またはシンボリック・リンクのパス名解決の過程で,長さが {PATH_MAX} を超える中間結果が生成された。

  • ENOENT--- path が既存のファイルを指定していない,または path が空の文字列である。

  • ENOTDIR--- path 接頭辞のコンポーネントがディレクトリでない。

  • EPERM--- times 引数は NULL ポインタではなく,呼び出し元プロセスの実効ユーザ ID はファイルへの書き込みアクセスを持っているが,ファイルのオーナと一致せず,呼び出し元プロセスは適切な特権を持っていない。

  • EROFS---ファイルを含んでいるファイル・システムは読み込み専用である。


unsetenv

環境リストから,環境変数名のすべてのインスタンスを削除します。

形式

#include <stdlib.h>

void unsetenv (const char *name);


引数

name

環境リストから削除する環境変数。

説明

unsetenv関数は,name 引数がポイントする変数名のすべてのインスタンスを環境リストから削除します。

usleep

指定されたインターバルだけ実行を一時停止します。

形式

#include <unistd.h>

int usleep (unsigned int mseconds);


引数

mseconds

実行を一時停止するマイクロ秒数。

説明

usleep関数は, mseconds 引数で指定されたマイクロ秒数だけ,カレント・プロセスの実行を一時停止します。この引数は 1,000,000 未満でなくてはなりません。値が 0 だった場合,呼び出しは何の効果も持ちません。

各プロセスに,1 つのリアルタイムのインターバル・タイマが存在しています。 usleep関数は,このタイマの前の設定には干渉しません。プロセスが usleepを呼び出す前にこのタイマを設定しており, mseconds で指定された時間がインターバル・タイマの以前の設定と等しいか,それよりも長かった場合,プロセスはタイマが満了する直前にウェイクアップします。


戻り値

0 成功を示します。
- 1 エラーが発生したことを示します。 errno は EINVAL に設定されます。


VAXC$CRTL_INIT

他の言語から HP C RTL を呼び出したり,メイン関数が C でない場合に HP C RTL を利用したりすることができます。この関数はランタイム環境を初期化し,終了および条件ハンドラの両方を設定します。 VAXC$CRTL_INITDECC$CRTL_INITの同義語です。どちらの名前も同じルーチンを呼び出します。

形式

#include <signal.h>

void VAXC$CRTL_INIT();


説明

次の例は, VAXC$CRTL_INIT関数を使って HP C RTL を呼び出す Pascal プログラムを示しています。

OpenVMS VAX システムの場合:


$ PASCAL EXAMPLE 
$ LINK EXAMPLE,SYS$LIBRARY:DECCRTL/LIB 
$ TY EXAMPLE.PAS 
PROGRAM TESTC(input, output); 
PROCEDURE VAXC$CRTL_INIT; extern; 
BEGIN 
   VAXC$CRTL_INIT; 
END 
$ 

OpenVMS Alpha システムの場合:


$ PASCAL EXAMPLE 
$ LINK EXAMPLE,SYS$LIBRARY:VAXCRTL/LIB  
$ TY EXAMPLE.PAS 
PROGRAM TESTC(input, output); 
PROCEDURE VAXC$CRTL_INIT; extern; 
BEGIN 
   VAXC$CRTL_INIT; 
END 
$ 

共用可能イメージがこの関数を呼び出す必要があるのは,そのイメージがシグナル処理,環境変数,I/O,終了処理,およびデフォルト・ファイル保護マスクのための HP C 関数を含んでいるか,コンテキストを継承しなくてはならない子プロセスである場合に限られます。

多くの初期化活動は 1 回しか実行されませんが, DECC$CRTL_INITは何度呼び出しても安全です。 OpenVMS VAX システムでは, DECC$CRTL_INITは, DECC$CRTL_INITが呼び出されるたびに, DECC$CRTL_INITを呼び出したルーチンのフレーム内で, HP C RTL の内部 OpenVMS 例外ハンドラを設定します。

OpenVMS 例外が UNIX シグナルにマップされるためには,現在のコール・スタックの中の少なくとも 1 つのフレームがハンドラを設定している必要があります。


VAXC$ESTABLISH

特定のルーチン用に OpenVMS 例外ハンドラを設定するために使用されます。この関数は,それを呼び出したルーチンの中で,特殊な HP C RTL 例外ハンドラを設定します。この特殊なハンドラは,後のルーチン内で発生するすべての RTL 関連の例外をキャッチし,それ以外のすべての例外をプログラマが用意したハンドラに渡します。

形式

#include <signal.h>

void VAXC$ESTABLISH (unsigned int (*exception_handler)(void *sigarr, void *mecharr));


引数

exception_handler

OpenVMS 例外ハンドラとして設定する関数の名前。この関数へのポインタを, VAXC$ESTABLISHへのパラメータとして渡すことになります。

sigarr

シグナル配列へのポインタ。

mecharr

メカニズム配列へのポインタ。

説明

プログラムが HP C RTL ルーチンの setjmpまたは longjmpを使用するときには, LIB$ESTABLISHの代わりに VAXC$ESTABLISHを使用する必要があります。 setjmplongjmp,または sigsetjmpsiglongjmpを参照してください。

VAXC$ESTABLISH関数は HP C for OpenVMS 関数からしか呼び出せません。この関数は, HP C コンパイラがランタイム・スタック上に割り当てるデータ・スペースに依存しているからです。 HP C 関数から直接に OpenVMS システム・ライブラリ・ルーチン LIB$ESTABLISHを呼び出すと, setjmpおよび longjmp関数で未定義の動作が発生します。

OpenVMS 例外に UNIX スタイルのシグナルを生成させるためには,ユーザ例外ハンドラは,自分が処理したくない例外を受信したときに SS$_RESIGNALを返さなくてはなりません。 SS$_NORMALを返すと, UNIX スタイルのシグナルの生成は行われません。 UNIX シグナルは,メインの C プログラムのスタック・フレーム内の例外ハンドラによって生成されたときと同じように扱われます。すべての OpenVMS 例外が UNIX シグナルに対応しているわけではありません。 OpenVMS 例外と UNIX スタイルのシグナルの関係については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4 章を参照してください。

引数 NULL を指定して VAXC$ESTABLISHを呼び出すと,そのルーチン内の既存のハンドラが取り消されます。

注意

  • OpenVMS Alpha システムでは, VAXC$ESTABLISHは, HP C RTL 関数ではなく,コンパイラの組み込み関数としてインプリメントされている。 (Alpha only)

  • OpenVMS VAX システムでは,/NAMES=AS_IS を指定してコンパイルされたプログラムは,そのプログラムが /PREFIX_LIBRARY_ENTRIES スイッチを指定してコンパイルされていたかどうかにかかわらず,名前 VAXC$ESTABLISHを解決するために SYS$LIBRARY:DECCRTL.OLB をリンクする必要がある。これはインプリメンテーション内における制約である。 (VAX only)


va_arg

引数リストの次の項目を返します。

形式

#include <stdarg.h> (ANSI C)

#include <varargs.h> (HP C Extension)

type va_arg (va_list ap, type);


引数

ap

取得しようとしている次の引数を含んでいる可変リスト。

type

リスト内の次の項目のサイズを決定するために使用されるデータ型。引数リストはさまざまなサイズの項目を含むことができますが,これを実行時に判定することはできないため,呼び出し元ルーチンは期待される引数の型を指定する必要があります。

説明

va_arg関数は,type に基づくリスト・インクリメンタによって指定されたアドレスにあるオブジェクトを解釈します。対応する引数が存在しない場合の動作は未定義です。

va_argを使って移植性のあるアプリケーションを作成したい場合には, <varargs.h>ヘッダ・ファイルではなく (ANSI C 標準で定義されている) <stdarg.h>ヘッダ・ファイルをインクルードし, va_arg<stdarg.h>に定義されている他の関数およびマクロのみと組み合わせて使用するようにします。

<stdarg.h>の関数と定義を使った引数リストの処理の例については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』例 3-6 を参照してください。


va_count

引数リストの中のロングワード (VAX only) またはクォドワード (Alpha only) の数を返します。

形式

#include <stdarg.h> (ANSI C)

#include <varargs.h> (HP C Extension)

void va_count (int count);


引数

count

ロングワード (VAX only) またはクォドワード (Alpha only) の数を取得しようとしている整変数の名前。

説明

va_countマクロは,引数リストの中のロングワード (VAX only) またはクォドワード (Alpha only) の数を count に格納します。count に返される値は, count フィールド自体を除いた,関数引数ブロックの中のロングワード (VAX only) またはクォドワード (Alpha only) の数です。

引数リストが,その格納にロングワード (VAX only) またはクォドワード (Alpha only) 以下のメモリしか必要としない項目を含んでいる場合,count 引数に返される値は引数の数でもあります。しかし,引数リストがロングワード (VAX only) またはクォドワード (Alpha only) よりも大きい項目を含んでいる場合には,引数の数を得るためには count の解釈を行う必要があります。 doubleは 8 バイトなので, OpenVMS VAX システムでは引数リスト位置を 2 つ分, OpenVMS Alpha システムでは 1 つ分占有します。

va_countマクロは HP C for OpenVMS システムに固有のものであり,移植性はありません。


va_end

<varargs.h>または <stdarg.h>セッションを終了します。

形式

#include <stdarg.h> (ANSI C)

#include <varargs.h> (HP C Extension)

void va_end (va_list ap);


引数

ap

引数リストの長さをトラバースするために使用されるオブジェクト。引数 ap は,形式のセクションに示している方法で宣言し,使用する必要があります。

説明

それぞれ va_start... va_endで区切って,引数リストの複数のトラバーサルを実行することができます。 va_end関数は,ap を NULL に設定します。

この関数を使って移植性のあるアプリケーションを作成したい場合には, <varargs.h>ヘッダ・ファイルではなく (ANSI C 標準で定義されている) <stdarg.h>ヘッダ・ファイルをインクルードし, va_end<stdarg.h>に定義されている他のルーチンのみと組み合わせて使用するようにします。

<stdarg.h>の関数と定義を使った引数リストの処理の例については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』例 3-6 を参照してください。


va_start, va_start_1

変数を引数リストの先頭に初期化するために使用されます。

形式

#include <varargs.h> (HP C Extension)

void va_start (va_list ap);

void va_start_1 (va_list ap, int offset);


引数

ap

オブジェクト・ポインタ。引数 ap は,形式のセクションに示している方法で宣言し,使用する必要があります。

offset

リスト内の (引数リストの先頭ではなく) それ以降の引数をポイントするために ap をインクリメントするバイト数。ゼロ以外のオフセットを使用することで,ap を,複数の固定引数の後にある最初のオプション引数のアドレスに初期化することができます。

説明

va_startマクロは,変数 ap を引数リストの先頭に初期化します。

va_start_1マクロは,既知の数の定義済み引数の後にある引数のアドレスに ap を初期化します。 printf関数は,引数リスト全体の先頭から一定のオフセットに可変長の引数リストを含んでいる HP C RTL 関数の一例です。可変長引数リストは,書式文字列のアドレスだけずれています。

va_start_1で使用するオフセット引数の値を決定する際には, OpenVMS 呼び出し標準の意味を考慮に入れる必要があります。

OpenVMS VAX では,ほとんどの引数項目はロングワードです。たとえば, OpenVMS VAX の char型と short型の引数は,引数リストに含まれているときにはロングワードのメモリを使用します。一方,OpenVMS VAX の float型の引数は, double型に変換されるため,2 つのロングワードを使用します。

OpenVMS Alpha では,すべての引数項目がクォドワードです。

注意

特に他のプログラミング言語で書かれたプログラムから (C で書かれた) サブルーチンに渡された引数リストにアクセスするときには, OpenVMS 呼び出し標準の意味を考慮に入れる必要があります。 OpenVMS 呼び出し標準の詳細については,『HP C User's Guide for OpenVMS Systems』または『 OpenVMS Calling Standard 』を参照してください。

上に示したバージョンの va_startva_start_1HP C RTL に固有のものであり,移植性はありません。

次の構文は,ANSI C 標準に定義されている, <stdarg.h>ヘッダ・ファイルの va_startマクロに関するものです。


形式

#include <stdarg.h> (ANSI C)

void va_start (va_list ap, parmN);


引数

ap

オブジェクト・ポインタ。引数 ap は,形式のセクションに示している方法で宣言し,使用する必要があります。

parmN

最後の既知の固定引数の名前。

説明

ポインタ ap は,引数リストの中の parmN の後にある最初のオプション引数をポイントするように初期化されます。

このバージョンの va_startは,必ず関数プロトタイプを使って宣言され,定義されている関数と組み合わせて使用するようにしてください。また,移植性のあるプログラムを作成したい場合には,このバージョンの va_startを使用してください。

<stdarg.h>の関数と定義を使った引数リストの処理の例については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』例 3-6 を参照してください。


前へ 次へ 目次 索引