Neden 99
Bu aslında bir maksimum değil . Bu, "sistem" hesapları için kimliklerin durduğu ve "gerçek kişi" hesapları için kimliklerin başladığı bir eşiktir. Bu da oldukça keyfi ve değişken. 100'ün kullanışlı bir yuvarlak sayı olması dışında 99 olması için gerçek bir sebep yok.
Bir platform için çeşitli parola ve grup veritabanı yönetimi araçları tarafından kararlaştırılan kullanışlı bir tur numarasıdır. Örneğin Debian sürüm 7'de, useradd
ve groupadd
araçları /etc/login.defs
"system" ve "user" olarak sayılan UID'lerin ve GID'lerin aralıklarını arar ve ikinci aralık, hem UID'ler hem de GID'ler için 1000 ila 60000'dür.
Neden 65534?
Öncelikle POSIX sistem çağrılarında iki yaygın sözleşme olduğu için:
- Bir dönüş değeri
-1
(dönüş türüne atama) bir hata gösterir; hata numarası errno
makroda bulunur.
- Bir giriş değeri
-1
"değişme" gösterir.
Bunlar evrensel sözleşmeler değil . geteuid()
Örneğin , sistem çağrısından hata gelme ihtimalinin olmadığına dikkat edin . (İşlemler her zaman etkili bir kullanıcı kimliğine sahiptir.) Yani orada static_cast<uid_t>(-1)
endişelenmenize gerek yok. Ancak bunlardan en az biri UID'ler ve GID'ler için geçerlidir. Gelen setreuid()
ve setregid()
sistemin bir tartışma çağrıları -1
vasıtası "değişiklik yok". Öyleyse static_cast<uid_t>(-1)
ve static_cast<gid_t>(-1)
gerçek kimlikler olarak uygun şekilde kullanılamaz.
İkincisi, Linux'taki UID'ler ve GID'ler 16-bit idi.
Bu, yüzyılın başlarında 32-bit olarak değişti, ancak yankıları devam ediyor ve aslında ilk başta göründüğünden daha ince. -1
16 bitlik işaretsiz bir tamsayıya çevirmek, ki bunun ne olduğunu uid_t
ve gid_t
(sistem çağrı arayüzünde) eskiden gördüğünüz gibi 65535'tir. Yani bu kullanılabilir bir UID veya GID değildi.
Ancak, 32-bit alanına geçti çekirdekleri 16 bit API kullanılan programların yararları için uid_t
ve gid_t
Linux bir "taşma UID" ve "taşma GID" tanımladı. Bunun nedeni, çeşitli noktalarda, 16 bit ile 32 bit arasında yapılan dökümden dolayı oldukça kötü etkileşimler olmasıydı. 16-bit programlar, çekirdek olmadığında UID 65536'yı süper kullanıcı olarak gördü. Eski çekirdekler, uygulama kodu kullanılmadığında UID 131072'yi süper kullanıcı olarak görüyorlardı.
"Taşma UID" ve "Taşma GID", 16 bitlik kod için tüm 32-bit UID'leri ve 65535 ila 65534'ten büyük GID'leri esas olarak eşledi. Bu, ikinci bir değer olan 0xFFFE'nin şimdi gerçek bir UID veya GID değeri olarak kullanılamaz olduğu anlamına gelir .
Ve tabii ki, -1
32-bit UID'ye attı ve GID türü de kullanılamaz.
(uint16_t) -1
bir hatayı belirtmek için kullanılır?