it-swarm.com.de

Garantiert POSIX die Pfade zu Standarddienstprogrammen?

Was ist von C aus der einfachste Weg, ein Standarddienstprogramm (z. B. ps) auszuführen, und kein anderes?

Garantiert POSIX, dass sich beispielsweise ein Standard-ps in /bin/ps Befindet, oder sollte ich die Umgebungsvariable PATH auf das zurücksetzen, was ich mit confstr(_CS_PATH, pathbuf, n); erhalte, und dann das Dienstprogramm ausführen PFAD-Suche?

22
PSkocik

Nein, hauptsächlich aus dem Grund, dass keine Systeme erforderlich sind, um standardmäßig oder nur dem POSIX-Standard (unter Ausschluss von) zu entsprechen jeder andere Standard).

Zum Beispiel hat Solaris (ein zertifiziertes kompatibles System) die Abwärtskompatibilität für seine Dienstprogramme in /bin Gewählt, was erklärt, warum sich diese auf arkane Weise verhalten, und POSIX-kompatible Dienstprogramme an verschiedenen Standorten bereitgestellt (/usr/xpg4/bin). /usr/xpg6/bin ... für verschiedene Versionen des XPG-Standards (jetzt in POSIX integriert), die tatsächlich Teil optionaler Komponenten in Solaris sind).

Selbst sh ist nicht garantiert in /bin. Unter Solaris war /bin/sh Bis Solaris 10 die Bourne-Shell (also nicht POSIX-kompatibel), während sie jetzt in Solaris 11 ksh93 ist (immer noch nicht vollständig POSIX-kompatibel, in der Praxis jedoch mehr als /usr/xpg4/bin/sh).

Ab C können Sie exec*p() verwenden und davon ausgehen, dass Sie sich in einer POSIX-Umgebung befinden (insbesondere in Bezug auf die Umgebungsvariable PATH).

Sie können auch die Umgebungsvariable PATH 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 festlegen, die Sie ausführen möchten (wobei zu berücksichtigen ist, dass auf einigen Systemen wie GNU) weitere Schritte wie das Festlegen eines POSIXLY_CORRECT variabel, um die Einhaltung zu gewährleisten).

Sie können auch Dinge ausprobieren wie:

execlp("sh", "sh", "-c", "PATH=`getconf PATH`${PATH+:$PATH};export PATH;"
                         "unset IFS;shift \"$1\";"
                         "exec ${1+\"[email protected]\"}", "2", "1", "ps", "-A"...);

In der Hoffnung, dass es in $PATH Ein sh gibt, dass es Bourne-ähnlich ist, dass es auch ein getconf gibt und dass es das für die Version von POSIX ist, die Sie sind interessiert an.

33

Eigentlich würde ich größtenteils antworten ja. POSIX garantiert:

  1. Dass es einen absoluten Pfad zu einer standardkonformen Version jedes angegebenen Dienstprogramms gibt,
  2. Und dass Sie in der Lage sein müssen, diesen absoluten Pfad zu finden und dieses Dienstprogramm auszuführen.

Obwohl nicht unbedingt garantiert werden muss, dass sich jedes Dienstprogramm systemübergreifend in einem bestimmten Verzeichnis befindet (/bin/ps), Wird immer garantiert, dass in der Lage sein Im Standard-PATH des Systems zu finden ist als ausführbare Datei.

Tatsächlich ist die einzige vom Standard festgelegte Möglichkeit, dies im Standard zu tun, (in C) über _CS_PATH von unistd.h Oder in der Shell über eine Kombination von command und getconf Dienstprogramme, dh PATH="$(command -p getconf PATH)" command -v ps müssen immer den eindeutigen absoluten Pfad von des POSIX-kompatiblen ps zurückgeben, das auf einem bestimmten System bereitgestellt wird. Das heißt, während es implementierungsdefiniert ist welche Pfade in der Standard-PATH-Variablen des Systems enthalten sind, müssen diese Dienstprogramme immer verfügbar sein, eindeutig, und konform in einem der darin angegebenen Pfade.

Siehe: < nistd.h >, Befehl .

3
Geoff Nixon