“Çıkış (-1)” nereden geldi?


22

Ben kullanmanızı öneririz internette eski yazılıma ve kötü öğreticiler bir sürü görmek exit(-1), return -1"anormal fesih" temsil etmek veya benzer. Sorun en azından POSIX’de -1hiç olmamıştı ve geçerli bir durum kodu değil. man 3 exitgöstermektedir exit()döndürür değerini status & 0377, yani ebeveyn -1olur 255. POSIX dışı sistemlerde, EXIT_FAILUREtaşınabilirlik için önerilir. Ancak "EXIT_FAILURE ile birlikte" -1, anormal sonlandırma "anlamına gelmez," -1 "nin POSIX dışı sistemlerde bile geleneksel olduğuna inandıklarını gösterir.

İşte bunu devam ettiren bir StackOverflow sorusu örneği . "Unrealircd" yazılımı da programı exit(-1)sonlandırmak için kullanılan bir program örneğidir . Uygulamada, bu arayüzü zorlaştırıyor systemd.

Bu anti-patern nereden geldi? Bazı bağlamlarda geçerli mi?


1
"Unix benzeri sistemler, 0 çıkış durumunun başarıyı gösterdiğine ve sıfır olmayan herhangi bir çıkış durumunun başarısızlık anlamına geldiğine dair güçlü bir sözleşmeye sahip ... Bu sözleşmenin Unix mermilerine bağlanması oldukça zor ..." ( Sıfır olmayan çıkış durumu temiz çıkış için )
gnat

@gnat libc manual'a göre çıkış durumu açıkça 0 ila 255 arasındadır. Olumsuz değerlerin geçerli bir noktada geçerli olduğunu belirten bir cevap varsa, bunu kabul ediyorum, ama bunu çok şüpheli buluyorum.
user222973

1
@gnat "255" kolayca bir uyuyor unsigned char.
user222973


1
@gnat "Java" daki bir bayt işaretsiz bir karakter değil char, değer aralığı -128 ile 127 arasında olduğundan daha fazla eşdeğerdir. Dahası, zaten "-1" in soru gövdesinde "255" e dönüştüğünü belirtmiştim .
user222973

Yanıtlar:


20

Hemen hemen tüm Unix bilgisayarları tamsayılar için twos-complement kullanırlar ve twos-complement -1'de kelime büyüklüğünden bağımsız olarak her zaman "tüm bit 1" olur. Programın çıkış durumunun büyüklüğünden bağımsız olarak mümkün olan en büyük çıkış kodunu istiyorsanız, -1 kullanarak ve kütüphanenin onu kısaltmasına izin vererek hileyi uygun şekilde yapın.

Bu, komut dosyaları veya programlar birden fazla olası çıkış durumuna sahip olduğunda (bkz grep. Basit bir örnek için), anlamlı olanlar genellikle en küçük sayılara atanır ve olası en büyük çıkış kodunu "bilinmeyen hata" ya da "için kullanmak için iyi yapar. iptal etme "çünkü anlamlı bir statü değeriyle hiçbir zaman çelişmek pek mümkün değildir.


Hangi uygular, bir örnek olarak glibc götür exit()olarak status &= 0xff. -1 & 0xff255 olmayan bir "kelime büyüklüğü" var mı ? Tabii ki hayır, çünkü bütün amaç onu 0-255 aralığında sığdırmak. Ne olursa olsun, son cümlenin bir anlamı yok: 128-255 durum kodlarının UNIX sistemlerinde özel bir amacı var.
user222973

2
Bash çıkış değerlerini (0-127, 128+ özel Bash değerleridir) program çıkış değerleri ile karıştırmayın (0-255, bkz. Pubs.opengroup.org/onlinepubs/009695399/functions/exit.html ). Boyuta gelince, C programcılarının başlangıçtan beri birden fazla kelime boyutuyla (başlangıçta 12, 16 ve 32 bit) uğraştığını unutmayın, bu nedenle otomatik olarak kelime boyutunu düşünmemizi gerektirmeyen deyimler için çalışırız. Unix, Posix'i 2 yıl öncesine kadar sürdüğünden beri, her zaman 8 bitlik bir sınırlama yoktu, bu yüzden yazmamızın önemi yoktu.
Todd Knarr
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.