日本-日本語
日本HPホーム 製品 & サービス サポート & ドライバー ソリューション ご購入方法
≫  お問い合わせ

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

OpenVMS マニュアル


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


前へ 次へ 目次 索引





第 8 章
メモリ割り当て関数

表 8-1 は, HP C Run-Time Library (RTL) のすべてのメモリ割り当て関数を示しています。各関数の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)』「リファレンス・セクション」を参照してください。

表 8-1 メモリ割り当て関数
関数 説明
brk, sbrk プログラムで使用されていない最下位仮想アドレスを判断する。
calloc, malloc メモリ領域を割り当てる。
cfree, free calloc malloc realloc 呼び出しによって割り当てられている領域を解放して,再割り当てできるようにする。
realloc 最初の引数によって示される領域のサイズを, 2 番目の引数によって指定されるバイト数に変更する。
strdup 文字列を複製します。

ヒープから追加記憶域を要求するすべての HP C RTL 関数は, HP C RTL のメモリ割り当て関数 malloccallocreallocfreecfreeを使用して,その記憶域を取得します。これらの関数によって割り当てられるメモリは,クォドワード境界に揃えられます。

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 のメモリ割り当て関数 callocmallocreallocfreeはそれぞれ,LIB$ ルーチン LIB$VM_CALLOC, LIB$VM_MALLOC,LIB$VM_REALLOC,LIB$VM_FREE をベースにしています。

ルーチン VAXC$CALLOC_OPTVAXC$CFREE_OPTVAXC$FREE_OPTVAXC$MALLOC_OPT
VAXC$REALLOC_OPTは破棄されましたので,今後の開発では使用できません。しかし,下位互換性を維持するために,標準的な C メモリ割り当てルーチンと同等として,これらのルーチンのバージョンも提供されています。

8.1 プログラムの例

例 8-1malloccallocfree関数の使用方法を示しています。

例 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
$ 




第 9 章
システム関数

オペレーティング・システムの開発には,C プログラミング言語が適しています。たとえば,UNIX オペレーティング・システムの大部分は C で書かれています。システム・プログラムを作成する場合,プログラムが動作する環境を検索または変更しなければならないことがあります。この章では,このような作業やその他のシステム・タスクを実行するための HP C Run-Time Library (RTL) 関数について説明します。

表 9-1 は, HP C RTL で提供されるすべてのシステム関数を示しています。各関数の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)』「リファレンス・セクション」を参照してください。

表 9-1 システム関数
関数 説明
システム関数---検索およびソート・ユーティリティ
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 は, timelocaltimestrftime関数を使用して端末に正しい日付と時刻をプリントする方法を示しています。

例 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
$ 


前へ 次へ 目次 索引



         印刷用画面へ

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