日本-日本語
≫  お問い合わせ

製品とサービス >  ソフトウェアとOS >  OpenVMS >  マニュアル >  V8.3ライブラリ

OpenVMS マニュアル


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


前へ 次へ 目次 索引





utimes

ファイルのアクセスおよび変更時刻を設定します。



形式

#include <time.h>

int utimes (const char *path, const struct timeval times[2]);




引数



path

ファイルへのポインタ。

times

timeval構造体の配列。第 1 の配列メンバは最終アクセスの日付と時刻を,第 2 のメンバは最終変更の日付と時刻を表します。 timeval構造体に含まれる時刻は Epoch 以来の経過秒数とマイクロ秒数を表しますが,最も近い秒への丸めが行われることもあります。



説明

utimes関数は, path 引数がポイントするファイルのアクセスおよび変更時刻を, times 引数の値に設定します。 utimes関数では,マイクロ秒までの精度で時刻を指定することができます。

times 引数が NULL ポインタである場合には,ファイルのアクセスおよび変更時刻は現在の時刻に設定されます。関数をこの形で使用するためには,プロセスの実効ユーザ ID がファイルのオーナと一致する,またはプロセスがファイルへの書き込み許可を持っているか,適切な特権を持っている必要があります。

実行に成功すると, utimesは最後のファイル状態の変更時刻 st_ctimeを更新します。

注意 (Alpha, I64)

OpenVMS Alpha システムおよび I64 システムでは, statfstatutime,および utimes関数は,新しいファイル・システムの POSIX 準拠のファイル・タイムスタンプ・サポートに対応して拡張されています。

このサポートは,V7.3 およびそれ以降の OpenVMS Alpha システム上の ODS-5 デバイスでのみ使用できます。

この変更が行われる以前, statおよび fstat関数は,以下のファイル属性に基づいて st_ctimest_mtime,および st_atimeフィールドの値を設定していました。

st_ctime---ATR$C_CREDATE (ファイル作成時刻)
st_mtime---ATR$C_REVDATE (ファイル更新時刻)
st_atime---ファイル・アクセス時刻がサポートされていなかったため,常に st_mtimeに設定されていた

また,ファイル変更時刻については, utimeおよび utimesは ATR$C_REVDATE ファイル属性を変更し,ファイル・アクセス時刻引数は無視していました。

変更が行われて以降,ODS-5 デバイス上のファイルについては, statおよび fstat関数は,以下の新しいファイル属性に基づいて st_ctimest_mtime,および st_atimeフィールドの値を設定するようになりました。

st_ctime---ATR$C_ATTDATE (最終属性変更時刻)
st_mtime---ATR$C_MODDATE (最終データ変更時刻)
st_atime---ATR$C_ACCDATE (最終アクセス時刻)

ODS-2 デバイスのように ATR$C_ACCDATE が 0 である場合, statおよび fstat関数は st_atimest_mtimeに設定します。

ファイル変更時刻については, utimeおよび utimes関数は, ATR$C_REVDATE と ATR$C_MODDATE の両方のファイル属性を変更します。ファイル・アクセス時刻については,これらの関数は ATR$C_ACCDATE ファイル属性を変更します。 ODS-2 デバイス上で ATR$C_MODDATE および ATR$C_ACCDATE ファイル属性を設定しても効果はありません。

互換性を保つために,デバイスの種類にかかわらず, 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---ファイルを含んでいるファイル・システムは読み込み専用である。




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 システムと I64 システムでは 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 システムおよび I64 システムでは,すべての引数項目がクォドワードです。

注意

特に他のプログラミング言語で書かれたプログラムから (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 を参照してください。


前へ 次へ 目次 索引



         印刷用画面へ

プライバシー 本サイト利用時の合意事項 ウェブマスターに連絡