- 1. 概要
- 2. getenv
- 3. setenv
- 4. system
- 5. メモリの割り当て
1. 概要
「stdlib.h」をどう理解するか。
標準ライブラリの中の「stdlib.h」ですからな。
標準中の標準とでもいうのでしょうか。
2. getenv
char *getenv(const char *name);
「name」で示す環境変数の値の文字列を返す。
3. setenv
int setenv(const char *name, const char *value, int overwrite);
環境変数「name」の値を「value」に設定する。
環境変数「name」が存在しない場合は、無条件に設定する。
環境変数「name」が存在する場合は、「overwrite」が 0 以外ならば、値を「value」に変更し、「overwrite」が 0 ならば変更しない。
4. system
書式は
#include <stdlib.h>
int system(const char *string);
マニュアルには、「system」 関数は、引数「string」をコマンドインタプリタ「sh」に渡します。呼び出し元プロセスは、シェルがそのコマンドの実行を完了するまで待ち、「SIGINT」および「SIGQUIT」を無視し、「SIGCHLD」をブロックします。」と書いてあります。
要は、「string」に書いた文字列をコマンドとして、そのまま実行するちゅうことです。
気を付けなければいけないのは、実行するシェルは「sh」であるということと、実行する際の環境変数は、プログラムを実行しているユーザの環境に依存するということですな。
また、戻り値がややこしい。
「gcc」では、下記のように書いてあります。
「string」が「NULL」の場合、 シェルが利用可能ならゼロ以外の値、利用不可なら「0」。
子プロセスを作成できなかった場合、または子プロセスのステータスを取得できなかった場合、 返り値は「-1」である。
子プロセスでシェルを実行できなかった場合、 返り値は子プロセスがステータス「127」で「_exit」を呼び出して終了したのと同じになる。
システムコールがすべて成功した場合、 返り値は「string」を実行するのに使用された子プロセスのシェルの終了ステータスとなる (シェルの終了ステータスはそのシェルが実行した最後のコマンドの終了ステータスである)。
端的にいうと、戻り値では、判定するのが難しいということです。
ですので、実行結果を取得するのは、「system」によって実行することが与える状況を別途判定して、実行結果が成功か失敗かを判断すべきだと思います。
5. メモリの割り当て
メモリの割り当て用に、以下の関数が用意されています。
#include <stdlib.h>
void *malloc(size_t size);
void *calloc(size_t number, size_t size);
void *realloc(void *ptr, size_t size);
void *reallocf(void *ptr, size_t size);
void free(void *ptr);
「size_t size」は、いずれも割り当てるメモリのサイズをバイト単位で指定します。
バイトのサイズが、バウンダリの境界にある場合は、適切な長さに調整されます。
「malloc」は、確保したメモリの中身は不定ですが、「calloc」は、0 で初期化されています。
「realloc」「reallocf」は、既に確保したメモリのサイズを指定サイズへ変更します。
いずれも、指定サイズのメモリが確保できなかった場合は、メモリのポインタに「NULL」ポインタが返ります。
「reallocf」は、指定サイズのメモリが確保できなかった場合は、メモリのポインタに「NULL」ポインタが返るだけでなく、確保していたメモリの領域を解放します。
「free」は、確保したメモリの領域を解放します。
|
      |