Evreler ve Sinyal İşleme
Önceki POSIX Evreleri Sonraki
Evreler ve Sinyal İşleme
int pthread_sigmask
(int             nasıl,
 const sigset_t *yenimaske,
 sigset_t       *eskimaske)
işlev
pthread_sigmask çağıran süreç için sinyal maskesini nasıl ve yenimaske argümanlarıyla belirtildiği şekilde değiştirir. Eğer eskimaske NULL değilse, önceki sinyal maskesi eskimaske ile gösterilen yerde saklanır.
nasıl ve yenimaske argümanlarının anlamı sigprocmask ile aynıdır. Eğer nasıl SIG_SETMASK ise, sinyal maskesi yenimaske yapılır. Eğer nasıl SIG_BLOCK ise, yenimaske için belirtilen sinyaller geçerli sinyal maskesine eklenir. Eğer nasıl SIG_UNBLOCK ise, yenimaske için belirtilen sinyaller geçerli sinyal maskesinden kaldırılır.
Sinyal maskeleri her evre başına ayarlanır, fakat sinyal hareketleri ve sinyal işleyicileri sigaction ile ayarlanır ve bütün evrelerce paylaşılır.
pthread_sigmask işlevi başarı halinde 0 döndürür, hata halinde de aşağıdaki hata kodlarından birini döndürür:
EINVAL
nasıl SIG_SETMASK, SIG_BLOCK veya SIG_UNBLOCK değerlerinden biri değildir.
EFAULT
yenimaske veya eskimaske geçersiz bir adresi göstermektedir.
int pthread_kill
(pthread_t evre,
 int       sinyalnum)
işlev
pthread_kill sinyalnum sinyal numarasını evre evresine gönderir. Sinyal Sinyal İşleme içinde anlatıldığı gibi teslim edilir ve işlenir.
pthread_kill başarı halinde 0 , hata halinde aşağıdaki hata kodlarından birini döndürür:
EINVAL
sinyalnum geçerli bir sinyal numarası değildir.
ESRCH
evre evresi mevcut değildir (örn. sonlandırılmış olabilir)
int sigwait
(const sigset_t *küme,
 int            *sinyal)
işlev
sigwait küme içindeki sinyallerden biri çağıran evreye ulaştırılıncaya kadar çağıran evreyi askıya alır. Ardından, alınan sinyal numarasını sinyal ile gösterilen yerde saklar ve döner. küme içindeki sinyaller durdurulmalıdır ve sigwait girişinde dikkate alınmalıdırlar. Eğer ulaştırılan sinyal yanında sinyal işleyici işlevine sahipse, bu işlev çağrılmaz.
sigwait bir iptal noktasıdır. Her zaman 0 döndürür.
sigwait'in güvenilir çalışması için, beklenen sinyaller sadece çağıran evrede değil bütün evrelerde durdurulmalıdır, aksi takdirde sinyal ulaştırmanın POSIX mantığı, sinyali alacak olan sigwait'in o evre olduğunu garanti etmez. Bunu başarmanın en iyi yolu, herhangi bir evre oluşturulmadan önce bu sinyalleri durdurmak ve onları yazılım içinde sigwait çağırmak haricinde serbest bırakmamaktır.
LinuxThreads'deki sinyal işleme POSIX standardındakiyle oldukça farklıdır. Standarda göre, "zamanuyumsuz" (dış) sinyaller bütün sürece (evrelerin toplamına) adreslenirler, ardından süreç bunları belirli bir evreye teslim eder. Sinyali alan evre sinyali o anda durdurmayan evrelerden herhangi biridir.
LinuxThreads'de, her evre aslında kendi süreç kimliği ile bir çekirdek sürecidir, bu nedenle dış sinyaller her zaman belirli bir evreye yönlendirilirler. Eğer, örneğin, başka bir evre o sinyalde sigwait içinde durdurulduysa, yeniden başlatılmaz.
sigwait'in LinuxThreads gerçeklemesi küme içindeki sinyaller için bekleme süresince kukla sinyal işleyicileri kurar. Sinyal işleyicileri bütün evrelerce paylaşıldığı için, diğer evreler bu sinyallere kendi sinyal işleyicilerini eklememeli veya bir seçenek olarak bütün hepsi sinyalleri durdurmalıdırlar (bu daima önerilmektedir).
Önceki Üst Ana Başlık Sonraki
Evreye Özgü Veri Başlangıç Evreler ve Çatallaşmak
Bir Linux Kitaplığı Sayfası