POSIX Semaforları
Önceki POSIX Evreleri Sonraki
POSIX Semaforları
Semaforlar evreler arasında paylaşılan kaynaklar için sayaçtırlar. Semaforlar üzerindeki temel işlemler: sayacı atomik olarak artırmak ve sayaç sıfırdan farklı oluncaya kadar beklemek ve atomik olarak azaltmak.
Semaforların azami bir değeri vardır ve bunu geçemezler. SEM_VALUE_MAX makrosu bu azami değer olmak için tanımlanmıştır. GNU C kütüphanesinde, SEM_VALUE_MAX ile INT_MAX eşittir. (Bkz. Bir Tamsayı Türün Aralığı), fakat diğer sistemlerde oldukça küçük olabilir.
POSIX evreleri kütüphanesi POSIX 1003.1b semaforlarını gerçeklemektedir. Bunlar System V semaforlarıyla (ipc, semctl ve semop) karıştırılmamalıdır.
Bütün semafor işlevleri ve makroları semaphore.h içinde tanımlıdır.
int sem_init
(sem_t       *sem,
 int          paylaşımlı,
 unsigned int değer)
işlev
sem_init sem ile gösterilen semafor nesnesini hazırlar. Semafor ile ilişkili sayı ilk değer olarak değer alır. paylaşımlı argümanı semaforun geçerli sürece yerel (sıfır ise) veya süreçler arasında paylaşımlı (sıfırdan farklı ise) olduğunu belirtir.
Başarı halinde sem_init 0 döndürür. Başarısızlık halinde -1 döndürür ve errno değerini aşağıdakilerden biri yapar:
EINVAL
değer azami sayaç değeri SEM_VALUE_MAX değerini aşmaktadır.
ENOSYS
paylaşımlı sıfır değildir. LinuxThreads henüz süreç-paylaşımlı semaforları desteklememektedir. (Bu aslında değişecek.)
int sem_destroy
(sem_t * sem)
işlev
sem_destroy semafor nesnesini sahip olabileceği kaynakları serbest bırakarak yok eder. Eğer herhangi bir evre sem_destroy çağrıldığında semaforda bekliyorsa, başarısız olur ve errno değerini EBUSY yapar.
LinuxThreads gerçeklemesinde, semafor nesneleriyle hiçbir kaynak ilişkilendirilmemiştir, bu nedenle sem_destroy aslında semaforda hiçbir evrenin beklemekte olmadığını sınamaktan başka birşey yapmaz. Bu süreç-paylaşımlı semaforlar gerçeklendiğinde değişecektir.
int sem_wait
(sem_t * sem)
işlev
sem_wait sem ile gösterilen semafor sıfır olmayan sayıya sahip oluncaya kadar çağıran evreyi askıya alır. Ardından atomik olarak semafor sayısını bir azaltır.
sem_wait bir iptal noktasıdır. Herzaman 0 döndürür.
int sem_trywait
(sem_t * sem)
işlev
sem_trywait işlevi sem_wait'in durdurmayan bir türevidir. Eğer sem ile gösterilen semafor sıfırdan farklı bir sayıya sahipse, sayı atomik olarak azaltılır ve sem_trywait hemen 0 döndürür. Eğer semafor sayısı sıfırsa, sem_trywait hemen -1 döndürür ve hata kodunu EAGAIN yapar.
int sem_post
(sem_t * sem)
işlev
sem_post işlevi sem ile gösterilen semafor sayısını atomik olarak artırır. Bu işlev hiçbir zaman durdurmaz.
Atomik karşılaştırma-ve-değiştirme destekleyen işlemcilerde (Intel 486, Pentium ve sonrası, Alpha, PowerPC, MIPS II, Motorola 68k, Ultrasparc), sem_post işlevi sinyal işleyicilerden güvenle çağrılabilir. Bu POSIX evreleri tarafından desteklenen zamanuyumsuz-sinyal güvenli tek evre eşzamanlama işlevidir. Intel 386 ve eski Sparc kıymıklarında, sem_post'un geçerli LinuxThreads gerçeklemesi zamanuyumsuz-sinyal güvenli değildir, çünkü donanım gerekli olan atomik işlemleri desteklememektedir.
sem_post semafor sayısı artırıldıktan sonra SEM_VALUE_MAX aşılmadığı sürece hep başarılı olur ve 0 döndürür. Bu durumda sem_post -1 döndürür ve errno hata kodunu EINVAL yapar. Semafor sayısı değiştirilmeden bırakılır.
int sem_getvalue
(sem_t * sem,
 int   * semdeg)
işlev
sem_getvalue işlevi sem semaforunun geçerli sayısını semdeg ile gösterilen yerde saklar. Hep 0 döndürür.
Önceki Üst Ana Başlık Sonraki
Koşul Değişkenleri Başlangıç Evreye Özgü Veri
Bir Linux Kitaplığı Sayfası