HP OpenVMS Systems Documentation |
| 前へ | 次へ | 目次 | 索引 |
表 8-1 は, HP C Run-Time Library (RTL) のすべてのメモリ割り当て関数を示しています。各関数の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)』「リファレンス・セクション」を参照してください。
| 関数 | 説明 |
|---|---|
| brk, sbrk | プログラムで使用されていない最下位仮想アドレスを判断する。 |
| calloc, malloc | メモリ領域を割り当てる。 |
| cfree, free | calloc , malloc , realloc 呼び出しによって割り当てられている領域を解放して,再割り当てできるようにする。 |
| realloc | 最初の引数によって示される領域のサイズを, 2 番目の引数によって指定されるバイト数に変更する。 |
| strdup | 文字列を複製します。 |
ヒープから追加記憶域を要求するすべての HP C RTL 関数は, HP C RTL のメモリ割り当て関数 malloc, calloc, realloc, free, cfreeを使用して,その記憶域を取得します。これらの関数によって割り当てられるメモリは,クォドワード境界に揃えられます。
ANSI C 標準には, cfreeは含まれていません。この理由から,メモリの割り当てを解除するには,同じ機能を実行する free関数を使用するようにしてください。
brk関数と sbrk関数では,メモリはアドレス空間の一番上から連続的に割り当てることができるものと仮定されています。しかし, malloc関数と RMS は,これと同じアドレス空間から領域を割り当てる可能性があります。 mallocを使用する HP C RTL ルーチンや RMS と組み合わせて, brk関数および sbrk関数を使用しないでください。
VAX C RTL に関するドキュメントの以前のバージョンには,メモリ割り当てルーチンは OpenVMS RTL の関数 LIB$GET_VM を使用して動的メモリを取得し, LIB$FREE_VM を使用して動的メモリを返すと示されていました。しかし,現在はこのようになっていません。これらのルーチンと HP C RTL メモリ割り当てルーチンの間の相互関係の問題はなくなりました ( ただし,LIB$SHOW_VM を使用して, HP C RTL の mallocおよび freeの使用状況を追跡することはできなくなりました )。
HP C RTL のメモリ割り当て関数 calloc, malloc, realloc, freeはそれぞれ,LIB$ ルーチン LIB$VM_CALLOC, LIB$VM_MALLOC,LIB$VM_REALLOC,LIB$VM_FREE をベースにしています。
ルーチン
VAXC$CALLOC_OPT,
VAXC$CFREE_OPT,
VAXC$FREE_OPT,
VAXC$MALLOC_OPT,
VAXC$REALLOC_OPTは破棄されましたので,今後の開発では使用できません。しかし,下位互換性を維持するために,標準的な C メモリ割り当てルーチンと同等として,これらのルーチンのバージョンも提供されています。
8.1 プログラムの例
例 8-1 は malloc, calloc, free関数の使用方法を示しています。
| 例 8-1 構造体に対するメモリの割り当てと割り当ての解除 |
|---|
/* CHAP_8_MEM_MANAGEMENT.C */
/* This example takes lines of input from the terminal until */
/* it encounters a Ctrl/Z, places the strings into an */
/* allocated buffer, copies the strings to memory allocated for */
/* structures, prints the lines back to the screen, and then */
/* deallocates all the memory used for the structures. */
#include <stdlib.h>
#include <stdio.h>
#define MAX_LINE_LENGTH 80
struct line_rec { /* Declare the structure. */
struct line_rec *next; /* Pointer to next line. */
char *data; /* A line from terminal. */
};
int main(void)
{
char *buffer;
/* Define pointers to */
/* structure (input lines). */
struct line_rec *first_line = NULL,
*next_line,
*last_line = NULL;
/* Buffer points to memory. */
buffer = malloc(MAX_LINE_LENGTH);
if (buffer == NULL) { /* If error ... */
perror("malloc");
exit(EXIT_FAILURE);
}
while (gets(buffer) != NULL) { /* While not Ctrl/Z ... */
/* Allocate for input line. */
next_line = calloc(1, sizeof (struct line_rec));
if (next_line == NULL) {
perror("calloc");
exit(EXIT_FAILURE);
}
/* Put line in data area. */
next_line->data = buffer;
if (last_line == NULL) /* Reset pointers. */
first_line = next_line;
else
last_line->next = next_line;
last_line = next_line;
/* Allocate space for the */
/* next input line. */
buffer = malloc(MAX_LINE_LENGTH);
if (buffer == NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
}
free(buffer); /* Last buffer always unused. */
next_line = first_line; /* Pointer to beginning. */
while (next_line != NULL) {
puts(next_line->data); /* Write line to screen. */
free(next_line->data); /* Deallocate a line. */
last_line = next_line;
next_line = next_line->next;
free(last_line);
}
exit(EXIT_SUCCESS);
}
|
次の例は, 例 8-1 の入力と出力を示しています。
$ RUN EXAMPLE line one line two [Ctrl/Z] EXIT line one line two $ |
オペレーティング・システムの開発には,C プログラミング言語が適しています。たとえば,UNIX オペレーティング・システムの大部分は C で書かれています。システム・プログラムを作成する場合,プログラムが動作する環境を検索または変更しなければならないことがあります。この章では,このような作業やその他のシステム・タスクを実行するための HP C Run-Time Library (RTL) 関数について説明します。
表 9-1 は, HP C RTL で提供されるすべてのシステム関数を示しています。各関数の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)』「リファレンス・セクション」を参照してください。
| 関数 | 説明 |
|---|---|
| システム関数---検索およびソート・ユーティリティ | |
| bsearch | ソートされたオブジェクトの配列でバイナリ検索を実行して,指定されたオブジェクトを検索する。 |
| qsort | クイック・ソート・アルゴリズムを実装することにより,オブジェクトの配列をソートする。 |
| システム関数---プロセス情報の検索 | |
| ctermid | SYS$COMMAND の等価文字列を与える文字列を返す。これは制御端末の名前である。 |
| cuserid | 現在のプロセスを開始したユーザの名前を格納した文字列を指すポインタを返す。 |
| getcwd | 現在のワーキング・ディレクリのファイル指定を指すポインタを返す。 |
|
getegid
,
geteuid
,
getgid , getuid |
OpenVMS の用語で,ユーザ識別コード (UIC) からグループ番号とメンバ番号を返す。 |
| getenv | 現在のプロセスの環境配列を検索し,指定された環境に関連付けられている値を返す。 |
| getlogin | 現在のセッションに関連付けられているユーザのログイン名を取得する。 |
| getpid | 現在のプロセスのプロセス ID を返す。 |
| getppid | 呼び出しプロセスの親プロセス ID を返す。 |
| getpwnam | ユーザ・データベース内のユーザ名情報にアクセスする。 |
| getpwuid | ユーザ・データベース内のユーザ ID 情報にアクセスする。 |
| システム関数---プロセス情報の変更 | |
| chdir | デフォルト・ディレクトリを変更する。 |
| chmod | ファイルのファイル保護を変更する。 |
| chown | ファイルのオーナのユーザ識別コード (UIC) を変更する。 |
| mkdir | ディレクトリを作成する。 |
| nice | 引数に指定された値だけ,プロセスの基本優先順位に対してプロセス優先順位を上げる,または下げる。 |
| putenv | 環境変数を設定する。 |
| setenv | 現在の環境リストに環境変数名を挿入する,またはリセットする。 |
| setgid, setuid | プログラムの移植性を確保するために実装されており,機能はない。 |
| sleep , usleep | 少なくとも引数に指定された秒数だけ,現在のプロセスの実行を停止する。 |
| umask | 新しいファイルが作成されるときに使用されるファイル保護マスクを作成する。古いマスクの値を返す。 |
| システム関数---日付/時刻情報の取得と変換 | |
| asctime | 年月日時分秒形式の時刻を 26 文字の文字列に変換する。 |
| clock | プログラムの実行開始以降に使用された CPU 時間をマイクロ秒単位で判断する。 |
| clock_getres | 指定されたクロックの精度を取得する。 |
| clock_gettime | 指定されたクロックの現在の時刻 (秒およびナノ秒) を返す。 |
| clock_settime | 指定されたクロックを設定する。 |
| ctime | 秒単位の時刻を asctime 関数で生成される形式の ASCII 文字列に変換する。 |
| decc$fix_time | OpenVMS のバイナリ・システム時刻を UNIX のバイナリ時刻に変換する。 |
| difftime | 引数によって指定される 2 つの時刻の差を秒単位で計算する。 |
| ftime | 1970 年 1 月 1 日 00:00:00 からの経過時間を timeb 構造体に返す。 |
| getclock | システム単位で設定されているクロックの現在の値を取得する。 |
| getdate | 書式設定された文字列を時刻/日付構造体に変換する。 |
| getitimer | 間隔タイマの値を返す。 |
| gettimeofday | 日付と時刻を取得する。 |
| gmtime | 時間単位を年月日時分秒形式の UTC 時刻に変換する。 |
| localtime | 時刻 (1970 年 1 月 1 日 00:00:00 からの経過時間を秒数で表現した時刻) を時,分,秒などに変換する。 |
| mktime | ローカル時刻構造体を Epoch (1970 年 1 月 1 日 00:00:00) からの経過時間に変換する。 |
| nanosleep | 高精度の sleep (リアルタイム)。指定された時間,プロセスの実行を一時停止する。 |
| setitimer | 間隔タイマの値を設定する。 |
| strftime, wcsftime | 指定された書式文字列による制御のもとで,配列に文字を格納する。 |
| strptime | 文字列を日付と時刻の値に変換する。 |
| time | 1970 年 1 月 1 日 00:00:00 からの経過時間を秒単位で返す。 |
| times | 現在のプロセスと終了した子プロセスの累積時間を返す。 |
| tzset | タイム・ゾーン変換を設定する,またはタイム・ゾーン変換にアクセスする。 |
| ualarm | 間隔タイマの時間切れを設定または変更する。 |
| wcsftime | tm 構造体に格納されている日付と時刻の情報を使用して,ワイド文字の出力文字列を作成する。 |
| システム関数---その他 | |
| VAXC$CRTL_INIT | 実行時環境を初期化し,終了および条件ハンドラを設定する。この結果, HP C RTL 関数を他の言語から呼び出すことができるようになる。 |
例 9-1 は, cuserid関数の使用方法を示しています。
| 例 9-1 ユーザ名へのアクセス |
|---|
/* CHAP_9_GET_USER.C */
/* Using cuserid, this program returns the user name. */
#include <stdio.h>
main()
{
static char string[L_cuserid];
cuserid(string);
printf("Initiating user: %s\n", string);
}
|
TOLLIVER という名前のユーザがプログラムを実行すると, stdoutに次の情報が表示されます。
$ RUN EXAMPLE1 Initiating user: TOLLIVER |
例 9-2 は, getenv関数の使用方法を示しています。
| 例 9-2 端末情報へのアクセス |
|---|
/* CHAP_9_GETTERM.C */
/* Using getenv, this program returns the terminal. */
#include <stdio.h>
#include <stdlib.h>
main()
{
printf("Terminal type: %s\n", getenv("TERM"));
}
|
132 カラム・モードの VT100 端末で 例 9-2 を実行すると,次の情報が表示されます。
$ RUN EXAMPLE3 Terminal type: vt100-132 |
例 9-3 は, getenvを使用してユーザのデフォルト・ログイン・ディレクトリを調べる方法と, chdirを使用してそのディレクトリに変更する方法を示しています。
| 例 9-3 デフォルト・ディレクトリの操作 |
|---|
/* CHAP_9_CHANGE_DIR.C */
/* This program performs the equivalent of the DCL command */
/* SET DEFAULT SYS$LOGIN. However, once the program exits, the */
/* directory is reset to the directory from which the program */
/* was run. */
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
main()
{
char *dir;
int i;
dir = getenv("HOME");
if ((i = chdir(dir)) != 0) {
perror("Cannot set directory");
exit(0);
}
printf("Current directory: %s\n", dir);
}
|
例 9-3 を実行すると,次の情報が表示されます。
$ RUN EXAMPLE4 Current directory: dba0:[tolliver] $ |
例 9-4 は, time, localtime, strftime関数を使用して端末に正しい日付と時刻をプリントする方法を示しています。
| 例 9-4 日付と時刻のプリント |
|---|
/* CHAP_9_DATE_TIME.C */
/* The time function returns the time in seconds; the localtime */
/* function converts the time to hours, minutes, and so on; */
/* the strftime function uses these values to obtain a string */
/* in the desired format. */
#include <time.h>
#include <stdio.h>
#define MAX_STRING 80
main()
{
struct tm *time_structure;
time_t time_val;
char output_str[MAX_STRING];
time(&time_val);
time_structure = localtime(&time_val);
/* Print the date */
strftime(output_str, MAX_STRING,
"Today is %A, %B %d, %Y", time_structure);
printf("%s\n", output_str);
/* Print the time using a 12-hour clock format. */
strftime(output_str, MAX_STRING,
"The time is %I:%M %p", time_structure);
printf("%s\n", output_str);
}
|
例 9-4 を実行すると,次の情報が表示されます。
$ RUN EXAMPLE5 Today is Thursday, May 20, 1993 The time is 10:18 AM $ |
| 前へ | 次へ | 目次 | 索引 |