Path
POSIX 是否保證任何標準實用程序的路徑?
從 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/sh
Solaris 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"...);
希望有一個
sh
in$PATH
,它類似於 Bourne,還有一個getconf
,並且它是您感興趣的 POSIX 版本的那個。