POSIXは標準ユーティリティへのパスを保証しますか?

POSIXは標準ユーティリティへのパスを保証しますか?

Cでpsなどの標準ユーティリティを実行する最も簡単な方法は何ですか?

たとえば、POSIXはps標準を保証しますか、/bin/psそれともPATH環境変数を私が得た値にリセットしconfstr(_CS_PATH, pathbuf, n);てから、PATH検索でユーティリティを実行する必要がありますか?

ベストアンサー1

いいえ、そうではありません。主にシステムが次の事項に従う必要がないためです。基本的に、または準拠ただPOSIX規格(他の規格を除く)

たとえば、Solaris(認証された互換システム)は、ユーティリティに対して以前のバージョンとの互換性を選択しました/bin。これは、これらのユーティリティが不思議な方法で動作し、さまざまな場所でPOSIX互換ユーティリティを提供する理由を説明します(他のバージョンのXPG(現在のPOSIXとマージ)標準/usr/xpg4/binの場合/usr/xpg6/bin、実際にはSolarisのオプションコンポーネントの一部です)。

入場もsh保証されません/bin。 Solarisでは/bin/shSolaris 10までBourneシェル(したがってPOSIXと互換性がありません)でしたが、現在Solaris 11ではksh93が使用されます(まだ完全にPOSIXと互換性はありませんが、実際にはPOSIXとは互換性があります/usr/xpg4/bin/sh)。

exec*p()Cでは、POSIX環境にあると仮定して使用できます(特にPATH環境変数関連)。

PATH環境変数を設定することもできます

#define _POSIX_C_SOURCE=200809L /* before any #include */
...
confstr(_CS_PATH, buf, sizeof(buf)); /* maybe append the original
                                      * PATH if need be */
setenv("PATH", buf, 1);
exec*p("ps"...);

あるいは、ビルド時に実行するPOSIXユーティリティのパスを決定することもできます(GNUシステムなどの一部のシステムでは、コンプライアンスを保証するための変数POSIXLY_CORRECT設定などの追加の手順が必要であることに注意してください)。

次のことを試すこともできます。

execlp("sh", "sh", "-c", "PATH=`getconf PATH`${PATH+:$PATH};export PATH;"
                         "unset IFS;shift \"$1\";"
                         "exec ${1+\"$@\"}", "2", "1", "ps", "-A"...);

Bourneのものと同様のshinがあり、興味のあるPOSIXバージョン用aもあることを願っています。$PATHgetconf

おすすめ記事