No, principalmente perché non richiede che i sistemi siano conformi per impostazione predefinita o conformi solo allo standard POSIX (ad esclusione di qualsiasi altro standard).
Ad esempio, Solaris (un sistema conforme certificato) ha scelto la retrocompatibilità per le sue utility in /bin
, il che spiega perché si comportano in modo arcano e forniscono utility compatibili con POSIX in posizioni separate ( /usr/xpg4/bin
, /usr/xpg6/bin
... per diverse versioni di XPG (ora unite in POSIX) standard, quelli che fanno effettivamente parte di componenti opzionali in Solaris).
Anche sh
non è garantito per essere in /bin
. Su Solaris, /bin/sh
era la shell Bourne (quindi non conforme a POSIX) fino a Solaris 10, mentre ora è ksh93 in Solaris 11 (ancora non completamente conforme a POSIX, ma in pratica più di così /usr/xpg4/bin/sh
).
Da C, puoi usare exec*p()
e presumere che ti trovi in un ambiente POSIX (in particolare per quanto riguarda la PATH
variabile d'ambiente).
È inoltre possibile impostare la PATH
variabile di ambiente
#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"...);
Oppure potresti determinare in fase di compilazione il percorso delle utility POSIX che vuoi eseguire (tenendo presente che su alcuni sistemi come quelli GNU, hai bisogno di più passaggi come impostare una POSIXLY_CORRECT
variabile per garantire la conformità).
Puoi anche provare cose come:
execlp("sh", "sh", "-c", "PATH=`getconf PATH`${PATH+:$PATH};export PATH;"
"unset IFS;shift \"$1\";"
"exec ${1+\"$@\"}", "2", "1", "ps", "-A"...);
Nella speranza che ci sia un sh
in $PATH
, che sia come Bourne, che ci sia anche un getconf
e che sia quello per la versione di POSIX che ti interessa.
/bin
, cioè/bin/ed
deve essere utilizzabile se ed è installato. Non riesco a trovarlo in questo momento, ma so che l'LSB dipende da questo, e ho difeso con successo i segnalazioni di bug usando quello come motivazione, quindi almeno deve essere stato vero ad un certo punto. (O era qualcosa di diverso da POSuX e mi ricordo male, ma il resto è vero.)