POSIX herhangi bir standart yardımcı programın yolunu garanti ediyor mu?


22

C'den, standart bir yardımcı program çalıştırmanın en kolay yolu nedir (örneğin, ps) ve başka bir şey yok?

Örneğin bir standart mu POSIX garanti psolduğunu /bin/psveya ben ile ne elde etmek PATH ortam değişkeni sıfırlamak gerekir confstr(_CS_PATH, pathbuf, n);ve ardından YOL-arama üzerinden hizmet programını çalıştırın?


Ben komutların bir dizi POSIX diyor kafamın, arkasında var, onları arasında (1) ed (için önemli olan mksh yani,) eğer kullanılabilir olduklarında, onlar da gerekir ulaşılabilir altında olacak /bin, yani /bin/edkullanışlı olmalıdır ed kurulu ise. Şu an bulamıyorum, ancak LSB'nin buna bağlı olduğunu biliyorum ve bunu mantıksal olarak kullanarak hata raporlarını başarıyla savundum, bu yüzden en azından bir noktada doğru olması gerekirdi. (Ya da POSuX'ten başka bir şeydi ve ben haksızlık ediyorum, ama gerisi doğrudur.)
mirabilos

Yanıtlar:


33

Hayır, esas olarak, sistemlerin varsayılan olarak uygun olmasını gerektirmemesi veya yalnızca POSIX standardına uymasını gerektirmez (herhangi bir standardın hariç tutulmasına).

Örneğin, Solaris (sertifikalı uyumlu sistemi) kendi programları için geriye dönük uyumluluk seçti /binbu gizli yollarla davranırlar ve ayrı yerlerde (POSIX uyumlu yarar sağlamak açıklar neden /usr/xpg4/bin, /usr/xpg6/bin... XPG farklı sürümleri için (şimdi birleşti (POSIX) standardına göre, aslında Solaris'teki isteğe bağlı bileşenlerin bir parçası olanlar).

Hatta shiçinde olması garanti edilmez /bin. Solaris'te, /bin/shSolaris 10'a kadar Bourne kabuğu (yani POSIX uyumlu değil), Solaris 11'de ksh93 (eskiden POSIX uyumlu değil, pratikte daha fazlası /usr/xpg4/bin/sh).

C'den, exec*p()POSIX ortamında olduğunuzu (özellikle PATHçevre değişkeniyle ilgili olarak ) kullanabilir ve varsayabilirsiniz .

Ayrıca PATHortam değişkenini de ayarlayabilirsiniz

#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"...);

Veya derleme zamanında çalıştırmak istediğiniz POSIX yardımcı programlarının yolunu belirleyebilir (GNU olanlar gibi bazı sistemlerde POSIXLY_CORRECTuyumluluk için değişken ayarlamak gibi daha fazla adıma ihtiyacınız olduğunu göz önünde bulundurarak ).

Gibi şeyler de deneyebilirsiniz:

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

Bir var umuduyla shiçinde $PATHo Bourne benzeri, ayrıca var ki bir olduğunu, getconfve POSIX Sen ilgilenen in sürümü için biri olduğunu.


Öyleyse #!
Joshua,

13
@Joshua: Varolması /usr/bin/envve çoğunlukla POSIX uyumlu olması için dua ediyorsun .
Kevin,

3
@Kevin veya palaeo-unix'inin tuhaflıkları hakkında bilgi edinin ve # değerini ayarlayın! doğru yolu kullanmak için
cas eylül

3
@Kevin: Hayır /usr/bin/envbir olan daha az taşınabilir (uygulamada) daha kesmek /bin/sh. POSIX'e Başına, bir kabuk senaryo yazmaya taşınabilir yoludur hiçbir ile #!hiç . Bir dosya çalıştırılabilir ancak ENOEXEC(geçerli bir ikili dosya değil), execvpstandart kabuk ile yürütmektir. :-) Elbette pratikte bu kötü bir fikir ve sadece kullanmanız gerekir #!/bin/sh.
R. ..

2
@GeoffNixon, bahsettiğiniz kısım _POSIX_C_SOURCE kullanmak istemediğiniz, kullanamadığınız veya istemediğinizde alternatif. $PATHC yerine kabuğun ayarını yapar .
Stéphane Chazelas

3

Aslında, büyük ölçüde evet cevaplardım . POSIX şunları garanti eder:

  1. Oradaki olduğu belirtilen her yarar standartlara uygun versiyonu için mutlak bir yol, bir,
  2. Ve bu mutlak yolu bulabilmeniz ve bu yardımcı programı çalıştırabilmeniz gerekir.

Her bir yardımcı programın tüm sistemlerde ( /bin/ps) belirli bir dizinde bulunması zorunlu değildir , ancak çalıştırılabilir bir dosya olarak her zaman varsayılan sistem PATH'inde bulunabileceği garanti edilir .

Gerçekten de, bir standart olarak bunun için yalnızca standart belirtilen yolu ile (C) 'dir unistd.hve bir kombinasyonu ile, s _CS_PATH veya kabuk içinde' commandve getconfaraçları, yani, PATH="$(command -p getconf PATH)" command -v psher zaman tek mutlak yol döndürmelidir POSIX uyumlu belirli bir sistemde tedarik edilir. Diğer bir deyişle, sistem varsayılan PATH değişkenine hangi yolların dahil edildiği tanımlanmış olsa da , bu kullanımlar burada belirtilen yollardan birinde her zaman kullanılabilir, benzersiz ve uyumlu olmalıdır .ps

Bakınız: < unistd.h >, komut .


Fakat sh için bir tavuk ve yumurta problemi var. Bu PATH=$(command -p getconf PATH)sadece bir POSIX ortamında bir POSIX kabuğundan işe yarayacaktır. POSIX, bu ortama nasıl girdiğinizi, sadece belgelendirildiğini belirtmez. Örneğin, Solaris'te, standardın iki farklı sürümü için farklı değerler döndüren bir /usr/xpg4/bin/getconfve a /usr/xpg6/bin/getconfdeğerine sahipsiniz _CS_PATHve hiçbiri /usr/xpg4/binde /usr/xpg6/binvarsayılan değerinde değildir $PATH. Bir /usr/bin/getconfIIRC size XPG4 uyumu veriyor.
Stéphane Chazelas

Solaris 11+ (UNIX 03+ sertifikalı) sürümler için bile doğru mu? Her zaman okudum `` `Uygulamalar ... getconf PATH tarafından döndürülen PATH'in sorgulanmasıyla belirlenmeli, iade edilen yol adının bir kabuk yerleşik değil mutlak bir yol adı olduğundan emin olunmalıdır. Örneğin, standart sh yardımcı programının konumunu belirlemek için: command -v sh Bazı uygulamalarda bu döndürebilir: / usr / xpg4 / bin / sh `` `, bunun shherhangi bir varsayılan kabuktan POSIX uyumlu bir giriş olması gerektiği anlamına gelir. .
Geoff Nixon,

1
POSIX'te, verilen sistemin getconfvarsayılanında bir komut olması gerektiğini söyleyen hiçbir şey yoktur $PATH. Örneğin, bir POSIX ortamına sahip olmak, herhangi bir Unix benzeri komut çalıştırmayacağınız bir emülasyon katmanının başlatılmasını içerebilir (örneğin, Windows düşünün). Uyumlu bir ortama girdiğinizde, uyumlu yardımcı programlara erişmeniz getconf PATH için size bir $PATHyol gösterilecektir, ancak bir POSIX ortamındaysanız, muhtemelen durum buydu. Not getconf psdöndürebilir ps. Having psyerleşiğini izin verilir.
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.