sigsuspend Kullanımı
Önceki Sinyalin Beklenmesi Sonraki
sigsuspend Kullanımı
Bir sinyali beklemenin en temiz ve güvenilir yolu sinyali engelleyip sigsuspend kullanmaktır. Bir döngü içinde sigsuspend kullanarak, her sinyal için farklı bir sinyal eylemci oluşturarak sinyalleri bekleyebilirsiniz.
int sigsuspend
(const sigset_t *küme)
işlev
Bu işlev sürecin sinyal maskesini küme ile değiştirerek bir sinyal eylemciyi çalıştıracak ya da süreci sonlandıracak bir sinyal alıncaya kadar süreci bekletir. Başka bir deyişle, süreç, küme'nin üyesi olmayan sinyallerden biri gelene dek süreci bekletir.
Eğer süreç bir sinyal eylemciyi çalıştıracak bir sinyalin alınması ve eylemci işlevin dönmesiyle işlemi sürdürüyorsa sigsuspend ayrıca dönecektir.
küme ile belirtilen maske sigsuspend etkin olduğu sürece geçerli olur. İşlev döndüğünde eski maske tekrar etkin olur.
Dönüş değeri ve hata durumu pause ile aynıdır.
Önceki bölümdeki pause ve sleep ile ilgili örnekleri sigsuspend tamamen güvenilir duruma getirebilirsiniz:
sigset_t mask, oldmask;

...

/* Geçici olarak engellenecek sinyallerin maskesini oluşturalım. */
sigemptyset (&mask);
sigaddset (&mask, SIGUSR1);

...

/* Sinyal gelmesini bekleyelim. */
sigprocmask (SIG_BLOCK, &mask, &oldmask);
while (!usr_interrupt)
  sigsuspend (&oldmask);
sigprocmask (SIG_UNBLOCK, &mask, NULL);

Kodun son parçası biraz dikkat gerektiriyor. Burada hatırlanması gereken nokta, sigsuspend döndüğünde sinyal maskesini çağrılmadan önceki değere ayarlamasıdır. Bu durumda SIGUSR1 sinyali bir kere daha engellenir. İkinci sigprocmask çağrısı bu sinyalin engellenmesini kaldırmak için gereklidir.
Bir diğer nokta: while döngüsünün neden gerekli olduğunu düşünebilirsiniz. Öyle ya, yazılım sadece tek bir SIGUSR1 sinyali bekliyor. Yanıt: sigsuspend'e aktarılan maskeye bakarsanız yazılımın ayrıca başka sinyalleri de beklediğini görürsünüz--örneğin, iş denetim sinyalleri. Eğer usr_interrupt değişkenine dokunmayan sinyal eylemciler de varsa, değişkeni değiştiren bir sinyal eylemci çalıştırılana kadar döngü sürecektir.
Bu teknik bir kaç satır daha gerektirir ama bu kullanım amacınıza uygun kriterlere bağlı olacaktır. Koda aslında sadece bu dört satırda bekler.
Önceki Üst Ana Başlık Sonraki
pause Sorunları Başlangıç Sinyal Yığıtı
Bir Linux Kitaplığı Sayfası