HP OpenVMS Systems Documentation |
| 前へ | 次へ | 目次 | 索引 |
現在の環境リストの name で指定された環境変数を挿入または再設定します。
#include <stdlib.h>int setenv (const char *name, const char *value, int overwrite);
name
環境変数リストの中の変数名。value
環境変数の値。overwrite
環境変数が存在していた場合,それを再設定するかどうかを示す 0 または 1 の値。
setenv関数は,現在の環境リストの環境変数 name を挿入または再設定します。リストに変数 name が存在しなければ, value 引数を使って挿入されます。変数が存在していれば,overwrite 引数がテストされます。 overwrite 引数の値に応じて,次の処理が行われます。
- 0 変数は再設定されない。
- 1 変数は value に再設定される。
0 成功を示します。 - 1 エラーを示します。 errno は ENOMEM に設定されます。環境リストを拡張するのに十分なメモリがありません。
プロセスの実効ユーザ ID を設定します。
#include <unistd.h>int seteuid (uid_t euid);
euid
実効ユーザ ID として設定する値。
プロセスに IMPERSONATE 特権がある場合, seteuid関数は,プロセスの実効ユーザ ID を設定します。特権のないプロセスは,euid 引数がプロセスの実ユーザ ID,実効ユーザ ID,保存済みユーザ ID のいずれかと同じ場合にのみ,実効ユーザ ID を設定できます。
0 成功を示します。 - 1 エラーを示します。この関数は,次のいずれかの値を errno に設定します。
- EINVAL -- euid 引数の値が不正,またはサポートされていません。
- EPERM -- プロセスに IMPERSONATE 特権がなく, euid が実ユーザ ID と保存済みセット・ユーザ ID のどちらとも一致しません。
POSIX ID が無効化されている場合には,プログラムの移植性のために setgidがインプリメントされており,何の機能も持ちません。成功を示す 0 を返します。POSIX ID が有効になっている場合には, setgidはグループ ID を設定します。
#include <types.h>#include <unistd.h>
int setgid (__gid_t gid); (_DECC_V4_SOURCE)
int setgid (gid_t gid); (not _DECC_V4_SOURCE)
gid
グループ ID に設定する値。
setgid関数は, POSIX スタイル識別子が有効の場合でも無効の場合でも使用できます。POSIX 形式の ID は, OpenVMS バージョン 7.3-2 およびそれ以降でサポートされています。
POSIX ID が無効化されている場合, setgid関数はプログラムの移植性のためにインプリメントされており,何の機能も持ちません。成功を示す 0 を返します。
POSIX ID が有効になっている場合には,次の処理が行われます。
- プロセスが IMPERSONATE 特権を持っている場合, setgid関数は実グループ ID,実効グループ ID,および保存済みセット・グループ ID を gid に設定する。
- プロセスが適切な特権を持っていないが,gid が実グループ ID または保存済みセット・グループ ID と等しければ, setgid関数は実効グループ ID を gid に設定する。実グループ ID と保存済みセット・グループ ID は変更されない。
- 呼び出し元プロセスの補助グループ ID はすべて変更されない。
POSIX 形式の ID を有効または無効にする方法については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 1.7 節を参照してください。
0 成功を示します。 - 1 エラーを示します。関数は errno を以下のいずれかの値に設定します。
- EINVAL -- gid 引数の値が無効で,インプリメンテーションによってサポートされていない。
- EPERM -- プロセスは適切な特権を持っておらず, gid は実グループ ID または保存済みセット・グループ ID と一致しない。
グループ・データベースをリワインドします。
#include <grp.h>void setgrent (void);
setgrent関数は,グループ・データベースを実質的にリワインドし,検索を繰り返し実行できるようにします。この関数は,必ず成功します。戻り値はありません。また, errnoも設定されません。
インターバル・タイマの値を設定します。
#include <time.h>int setitimer (int which, struct itimerval *value, struct itimerval *ovalue);
which
インターバル・タイマのタイプ。 HP C RTL は ITIMER_REAL のみをサポートしています。value
タイマ・インターバルとインターバルの終わりまでの残り時間をメンバとして含んでいる itimerval構造体へのポインタ。ovalue
現在のタイマ・インターバルとインターバルの終わりまでの残り時間をメンバとして含んでいる itimerval構造体へのポインタ。
setitimer関数は,which で指定されたタイマを value で指定された値に設定し, ovalue がゼロ以外の値であれば,タイマの前の値を返します。
struct itimerval { struct timeval it_interval; struct timeval it_value; };
itimerval構造体のメンバの値は以下のとおりです。
itimerval メンバの値 意味 it_interval = 0 次にタイマが満了したときにタイマを無効化する ( it_value がゼロ以外の値である場合)。 it_interval = ゼロ以外 タイマが満了したときに, it_value の再ロードに使用される値を指定する。 it_value = 0 タイマを無効化する。 it_value = ゼロ以外 次にタイマが満了するまでの残り時間を示す。
システム・クロックの解像度よりも小さいタイマ値は,この解像度にまで丸められます。
getitimer関数は, <time.h>ヘッダ・ファイルに ITIMER_REAL として定義されている 1 つのインターバル・タイマを提供しています。このタイマはリアル・タイムでデクリメントします。タイマが満了すると,SIGALARM シグナルが送信されます。
注意
setitimerと, alarm, sleep,または usleepの間の相互作用は定められていません。
0 成功を示します。 - 1 エラーが発生しました。 errno はエラーを示す値に設定されます。
ネストした一連の関数呼び出しから,通常の方法を使わずに,つまり一連の return文を使用せずに,定義済みのポイントに制御を移すための手段を提供します。 setjmp関数は,呼び出し元関数のコンテキストを環境バッファに保存します。
#include <setjmp.h>int setjmp (jmp_buf env);
env
環境バッファ。呼び出し元の関数のレジスタ・コンテキストを保持するのに十分な長さを持つ整数の配列でなくてはなりません。 jmp_buf型は <setjmp.h>ヘッダ・ファイルに定義されています。このバッファには,プログラム・カウンタ (PC) を含む汎用レジスタの内容が格納されます。
setjmpは,初めて呼び出されたときには値 0 を返します。その後, setjmpの呼び出しと同じ環境を指定して longjmpを呼び出すと,制御は通常どおりに返ったかのように再び setjmp呼び出しに戻されます。この 2 回目のリターンにおける setjmpの戻り値は, longjmp呼び出しで指定された値です。 setjmpの真の値を保存するためには,対応する longjmpが呼び出されるまで, setjmpを呼び出す関数を再び呼び出さないようにする必要があります。setjmp関数はハードウェア汎用レジスタを保存し, longjmp関数はそれらを復元します。 longjmpの後には, volatileとしてマークされていないローカル自動変数を除くすべての変数が, longjmpの時点の値を持つようになります。 volatileとしてマークされていないローカル自動変数の値は不定です。
setjmpおよび longjmp関数は, OpenVMS 条件処理機能を使用して,シグナル・ハンドラによる非ローカル goto を実現します。 longjmp関数は, HP C RTL 指定のシグナルを生成し, OpenVMS 条件処理機能がデスティネーションに戻れるようにすることでインプリメントされています。
HP C RTL は,任意の HP C イメージのシグナル処理を制御できなくてはなりません。 HP C がシグナル処理を制御できるようにするためには,すべての例外処理を VAXC$ESTABLISH関数の呼び出しを通して設定しなくてはなりません。詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4.2.5 項と, VAXC$ESTABLISH関数を参照してください。
注意
Alpha 固有の非標準的な decc$setjmpおよび decc$fast_longjmp関数が用意されています。標準関数の代わりにこれらの非標準関数を使用するためには,プログラムを __FAST_SETJMP または __UNIX_SETJMP マクロを定義してコンパイルする必要があります。標準の longjmp関数とは異なり, decc$fast_longjmp関数は第 2 引数を 0 から 1 に変換しません。 decc$fast_longjmpの呼び出しの後,対応する setjmp関数は, decc$fast_longjmp呼び出しで指定された第 2 引数とまったく同じ値で返ります。
OpenVMS 条件ハンドラから longjmp関数を呼び出すことはできません。ただし,以下のネスト制約の範囲内で, HP C RTL がサポートしている任意のシグナルに対して確立されたシグナル・ハンドラから longjmpを呼び出すことができます。
- longjmp関数は,ネストしたシグナル・ハンドラから呼び出された場合には動作しない。他のシグナル・ハンドラ内で生成された例外の結果として実行されたシグナル・ハンドラから呼び出された longjmp関数の結果は未定義である。
- 対応する longjmpを,シグナルの処理が完了する前に発行したい場合を除いて,シグナル・ハンドラから setjmp関数を呼び出してはならない。
- 終了ハンドラ ( atexitまたは SYS$DCLEXH で設定) の中から longjmp関数を呼び出してはならない。終了ハンドラはイメージのティアダウンの後に呼び出されるので, longjmpのデスティネーション・アドレスは存在しなくなっている。
- シグナル・ハンドラの中から,メインの実行スレッドに戻るために longjmpを呼び出すと,プログラムの状態の一貫性が失われることがある。副作用として,I/O が実行できなくなったり, UNIX シグナルを受信できなくなったりする可能性がある。代わりに siglongjmpを使用すること。
説明のセクションを参照してください。
category および locale 引数によって指定された,プログラムのロケールの該当部分を選択します。この関数を使用すると, 1 つのカテゴリ,またはプログラムのカレント・ロケール全体を変更または照会することができます。
#include <locale.h>char *setlocale (int category, const char *locale);
category
カテゴリの名前。ロケール全体を変更または照会するには, LC_ALL を指定します。その他の有効なカテゴリ名は以下のとおりです。
- LC_COLLATE
- LC_CTYPE
- LC_MESSAGES
- LC_MONETARY
- LC_NUMERIC
- LC_TIME
locale
ロケールを指定する文字列へのポインタ。
setlocale関数は, category および locale 引数によって指定された,プログラムのロケールの該当部分を設定または照会します。 category 引数として LC_ALL を指定すると,ロケール全体が指定されます。その他の値を指定すると,プログラムのロケールの一部のみが指定されます。locale 引数は,使用するロケールを識別する文字列をポイントします。この引数は以下のいずれかです。
- パブリック・ロケールの名前
次の形式でパブリック・ロケールを指定します。
language_country.codeset[@modifier]
関数は,論理名 SYS$I18N_LOCALE によって定義された位置で,パブリック・ロケール・バイナリ・ファイルを探します。ファイル・タイプのデフォルトは. LOCALE です。名前の中のピリオド (.) とアットマーク (@) 文字は,下線 (_) に置き換えられます。
たとえば,指定された名前が "zh_CN.dechanzi@radical" だった場合,関数は SYS$I18N_LOCALE:ZH_CN_DECHANZI_RADICAL.LOCALE バイナリ・ロケール・ファイルを探します。- ファイル指定
バイナリ・ロケール・ファイルを指定します。任意の有効なファイル指定を使用することができます。デバイスまたはディレクトリが省略された場合,関数は現在の呼び出し元デバイスとディレクトリを,省略されたコンポーネントのデフォルト値として使用します。ファイルが見つからなかった場合,関数は SYS$I18N_LOCALE 論理名によって定義されたデバイスとディレクトリをデフォルト値として適用します。ファイル・タイプのデフォルト値は .LOCALE です。
ワイルドカードは使用できません。バイナリ・ロケール・ファイルはリモート・ノード上には存在できません。- "C"
C ロケールを指定します。プログラムが setlocaleを呼び出さない場合には, C ロケールがデフォルトとなります。- "POSIX"
C ロケールと同じです。- ""
ロケールが国際環境論理名の設定をもとに初期化されることを指定します。関数は,定義されている論理名を発見するまで,次の順序で論理名をチェックします。
- LC_ALL
- カテゴリに対応する論理名。たとえば,カテゴリとして LC_NUMERIC が指定されている場合, setlocaleがチェックする最初の論理名は LC_NUMERIC となる。
- LANG
- SYS$LC_ALL
- SYS$LC_* 論理名によって定義される,カテゴリのシステム・デフォルト。たとえば,LC_NUMERIC カテゴリのデフォルトは, SYS$LC_NUMERIC 論理名によって定義される。
- SYS$LANG
どの論理名も定義されていなければ,デフォルトでは C ロケールが使用されます。 SYS$LC_* 論理名は,システムのスタートアップ時にセットアップされます。
locale 引数と同様に,国際環境論理名の等価名は,パブリック・ロケールの名前か,ファイル指定となります。 setlocale関数はこの等価名を, locale 引数で指定されたかのように扱います。- NULL
setlocaleにカレント・ロケールを照会させます。関数は,プログラムのロケールの category に関連付けられた部分を記述する文字列へのポインタを返します。 LC_ALL カテゴリを指定すると,ロケール全体を記述する文字列が返されます。ロケールの変更は行われません。- 前の setlocaleの呼び出しから返された文字列
関数は,プログラムのロケールの category に関連付けられた部分を復元します。文字列がロケール全体の記述を含んでいる場合には,文字列の category に対応する部分が使用されます。文字列がプログラムのロケールのうちの 1 つのカテゴリの部分を記述している場合には,そのロケールが使用されます。つまり,たとえば LC_COLLATE カテゴリを指定した setlocale呼び出しから返された文字列を使って, LC_MESSAGES カテゴリに同じロケールを設定することができます。
指定されたロケールが使用可能である場合, setlocaleは,プログラムのロケールの category に関連付けられた部分を記述する文字列へのポインタを返します。LC_ALL カテゴリでは,返される文字列はプログラムのロケール全体を記述します。エラーが発生した場合には,NULL ポインタが返され,プログラムのロケールは変更されません。
setlocaleへのそれ以降の呼び出しは,返された文字列を上書きします。ロケールのその部分を復元する必要がある場合には,プログラム内で文字列を保存しておくようにしてください。呼び出し元のプログラムは,返される文字列の形式または長さに関する仮定を行うべきではありません。
x ロケールを記述する文字列へのポインタ。 NULL エラーが発生したことを示します。 errno が設定されます。
#include <errno.h> #include <stdio.h> #include <locale.h> /* This program calls setlocale() three times. The second call */ /* is for a nonexistent locale. The third call is for an */ /* existing file that is not a locale file. */ main() { char *ret_str; errno = 0; printf("setlocale (LC_ALL, \"POSIX\")"); ret_str = (char *) setlocale(LC_ALL, "POSIX"); if (ret_str == NULL) perror("setlocale error"); else printf(" call was successful\n"); errno = 0; printf("\n\nsetlocale (LC_ALL, \"junk.junk_codeset\")"); ret_str = (char *) setlocale(LC_ALL, "junk.junk_codeset"); if (ret_str == NULL) perror(" returned error"); else printf(" call was successful\n"); errno = 0; printf("\n\nsetlocale (LC_ALL, \"sys$login:login.com\")"); ret_str = (char *) setlocale(LC_ALL, "sys$login:login.com"); if (ret_str == NULL) perror(" returned error"); else printf(" call was successful\n"); }
この例のプログラムを実行すると,次の結果が生成されます。
setlocale (LC_ALL, "POSIX") call was successful setlocale (LC_ALL, "junk.junk_codeset") returned error: no such file or directory setlocale (LC_ALL, "sys$login:login.com") returned error: nontranslatable vms error code: 0x35C07C %c-f-localebad, not a locale file
| 前へ | 次へ | 目次 | 索引 |