Sté*_*las 35
不,不是,主要是因为它不要求系统默认符合,或仅符合POSIX 标准(排除任何其他标准)。
例如,Solaris(经过认证的兼容系统)为其实用程序选择了向后兼容性/bin
,这解释了为什么这些实用程序以神秘的方式运行,并在不同的位置(/usr/xpg4/bin
, /usr/xpg6/bin
... 用于不同版本的 XPG(现已合并)提供符合 POSIX 的实用程序POSIX) 标准,那些实际上是 Solaris 中可选组件的一部分)。
即使sh
不保证在/bin
. 在 Solaris 上,/bin/sh
在 Solaris 10 之前一直是 Bourne shell(因此不符合 POSIX),而现在在 Solaris 11 中是 ksh93(仍然不完全符合 POSIX,但实际上比 更符合 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"...);
Run Code Online (Sandbox Code Playgroud)
或者,您可以在构建时确定要运行的 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"...);
Run Code Online (Sandbox Code Playgroud)
希望有一个sh
in $PATH
,它像 Bourne 一样,还有一个getconf
并且它是您感兴趣的 POSIX 版本的那个。
归档时间: |
|
查看次数: |
3198 次 |
最近记录: |