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/sh
Solaris 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のものと同様のsh
inがあり、興味のあるPOSIXバージョン用aもあることを願っています。$PATH
getconf