C言語 - 標準ライブラリ - stdlib.h

 クラウディア
1. 概要
2. getenv
3. setenv
4. system

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」によって実行することが与える状況を別途判定して、実行結果が成功か失敗かを判断すべきだと思います。