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

答え2

実際、私が主に答えるのははい。 POSIXは以下を保証します。

  1. そこはい指定された各ユーティリティの標準互換バージョンへの絶対パス、
  2. そして、この絶対パスを見つけて、このユーティリティを実行できる必要があります。

各ユーティリティが必ずしもすべてのシステム()の特定のディレクトリにあるとは限りませんが、/bin/ps常に保証されています。可能だった実行可能ファイルとしてシステムのデフォルトパスにあります。

実際、標準でこれを行う唯一の標準指定方法は、(Cで)unistd.h_CS_PATHを介するか、シェルとcommandユーティリティgetconfの組み合わせを介することです。つまり、PATH="$(command -p getconf PATH)" command -v ps一意の絶対パスを常に返す必要があります。これps特定のシステムで提供されるPOSIX互換。つまり、実装によって定義されているが、どのパスはシステムのデフォルトのPATH変数に含まれており、これらのユーティリティはいつもしなければならないここで指定されたパスの1つで利用可能で、一意で互換性があります。

参照:<unistd.h>、注文する

関連情報