Path

POSIX 是否保證任何標準實用程序的路徑?

  • September 4, 2019

從 C 語言中,執行標準實用程序(例如 ps)最簡單的方法是什麼?

例如,POSIX 是否保證標準ps存在,/bin/ps或者我應該將 PATH 環境變數重置為我得到的confstr(_CS_PATH, pathbuf, n);,然後通過 PATH-search 執行該實用程序?

不,它不需要,主要是因為它不要求系統預設符合,或者符合POSIX 標準(排除任何其他標準)。

例如,Solaris(一個經過認證的兼容系統)為其實用程序選擇了向後兼容性/bin,這解釋了為什麼它們以神秘的方式執行,並在不同的位置提供符合 POSIX 的實用程序(/usr/xpg4/bin/usr/xpg6/bin…對於不同版本的 XPG(現已合併POSIX)標準,這些實際上是 Solaris 中可選組件的一部分)。

甚至sh不能保證在/bin。在 Solaris 上,在/bin/shSolaris 10 之前曾經是 Bourne shell(因此不兼容 POSIX),而現在在 Solaris 11 中是 ksh93(仍然不完全兼容 POSIX,但實際上比/usr/xpg4/bin/sh.

從 C 中,您可以使用exec*p()並假設您處於 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"...);

希望有一個shin $PATH,它類似於 Bourne,還有一個getconf,並且它是您感興趣的 POSIX 版本的那個。

引用自:https://unix.stackexchange.com/questions/538844