Nein, dies ist nicht der Fall, hauptsächlich aus dem Grund, dass für Systeme keine Standardkonformität oder nur die Einhaltung des POSIX-Standards (unter Ausschluss eines anderen Standards) erforderlich ist .
Zum Beispiel Solaris (ein zertifiziertes konformes System) wählte die Abwärtskompatibilität für sein Dienstprogramme /bin
, was erklärt , warum diejenigen , verhalten sie in obskuren Wegen und POSIX-konformen Dienstprogramme in getrennten Standorten bieten ( /usr/xpg4/bin
, /usr/xpg6/bin
... für verschiedene Versionen der XPG (jetzt verschmolzen im POSIX) -Standard, wobei diese Komponenten tatsächlich Teil optionaler Komponenten in Solaris sind.
Auch sh
ist nicht garantiert, in zu sein /bin
. Unter Solaris /bin/sh
früher das Bourne - Shell (also nicht POSIX - konform) bis Solaris 10, während es jetzt ksh93 in Solaris 11 (noch nicht vollständig POSIX - konform, aber in der Praxis mehr als /usr/xpg4/bin/sh
).
Ab C können Sie verwenden exec*p()
und davon ausgehen, dass Sie sich in einer POSIX-Umgebung befinden (insbesondere in Bezug auf die PATH
Umgebungsvariable).
Sie können auch die PATH
Umgebungsvariable festlegen
#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"...);
Oder Sie können zum Zeitpunkt der Erstellung den Pfad der POSIX-Dienstprogramme bestimmen, die Sie ausführen möchten (unter Berücksichtigung der Tatsache, dass auf einigen Systemen wie GNU weitere Schritte erforderlich sind, z. B. das Festlegen einer POSIXLY_CORRECT
Variablen, um die Konformität sicherzustellen).
Sie können auch Folgendes ausprobieren:
execlp("sh", "sh", "-c", "PATH=`getconf PATH`${PATH+:$PATH};export PATH;"
"unset IFS;shift \"$1\";"
"exec ${1+\"$@\"}", "2", "1", "ps", "-A"...);
In der Hoffnung, dass es ein sh
In gibt $PATH
, dass es Bourne-artig ist, dass es auch ein gibt getconf
und dass es dasjenige für die Version von POSIX ist, an der Sie interessiert sind.
/bin
/bin/ed