alarm ve setitimer işlevleri bir sürecin kendisine gelecekte bir kesme göndermesini sağlar. Bunu bir zamanlayıcıyı ayarlayarak yaparlar; zamanlayıcının süresi dolduğunda süreç bir sinyal alır.
Her süreç üç bağımsız zamanlayıcı kullanabilir:
Herhangi bir anda bu üç zamanlayıcıdan sadece birini kullanabilirsiniz. Henüz zamanaşımına uğramamış bir zamanlayıcıyı tekrar kullanmaya çalışırsanız, zamanlayıcıyı basitçe yeni değerle yeniden başlatmış olursunuz.
Bir
setitimer veya
alarm işlevini çağırmadan önce
signal veya
sigaction işlevini kullanarak ilgili alarm sinyali için bir sinyal eylemci oluşturmalısınız. Aksai takdirde, bir olağandışı olaylar zinciri yazılımınız daha bir sinyal eylemci kurmaya fırsat bulamadan zamanlayıcının zamanaşımına uğramasına sebep olabilir. Bu durumda, alarm sinyalleri için öntanımlı eylem sürecin sonlandırılması olduğundan yazılımınız sonlanırdı. Bkz.
Sinyal İşleme.
Durdurulmadığı takdirde sonsuza kadar engelleme yapabilecek bir sistem çağrısını durdurmak amacıyla alarm işlevinin kullanılmasını mümkün kılmak için sinyal eylemcinin sigaction ile SA_RESTART seçeneği atanmadan oluşturulması önemlidir. sigaction kullanılmadığı durumda işler biraz daha karışıktır, çünkü signal işlevinin yeniden başlatma açısından işleyiş mantığı sabittir: BSD mantığına göre bu seçenek atanır. Dolayısıyla herhangi bir nedenle sigaction kullanılamazsa signal değil sysv_signal kullanmak gerekir.
Bir alarm ayarlanmak istendiğinde ilk akla gelen
setitimer işlevidir. Bu oluşum
sys/time.h başlık dosyasında bildirilmiştir. Gerçek zamanlı bir zamanlayıcıyı etkinleştirmek için biraz daha basit bir arayüz sunan
alarm işlevi ise
unistd.h dosyasında bildirilmiştir.
Bu yapı bir zamanlayıcıyı ayarlamak için kullanılır. Şu üyeleri içerir:
-
struct timeval it_interval
Zamanlayıcı kesmeleri arasındaki süredir. Sıfırsa alarm sadece bir kere gönderilir.
-
struct timeval it_value
İlk zamanlayıcı kesmesine kadar geçen süredir. Sıfırsa alarm iptal edilir.
The
struct timeval data type is described in
Süre.
int setitimer | (int tür,
struct itimerval *yeni,
struct itimerval *eski) |
işlev
setitimer işlevi tür türündeki zamanlayıcıyı yeni değere ayarlarlar. tür argümanı ITIMER_REAL, ITIMER_VIRTUAL ve ITIMER_PROF değerlerinden biri olabilir.
eski bir boş gösterici değilse, işlev henüz zamanaşımına uğramamış aynı türde bir zamanlayıcı varsa onunla ilgili yapıyı bu gösterici ile döndürür.
İşlev başarılı ise dönüş değeri 0, değilse -1'dir. Aşağıdaki errno hata değeri bu işlev için tanımlanmıştır:
- EINVAL
Zamanlayıcının süresi çok uzun.
int getitimer | (int tür,
struct itimerval *eski) |
işlev
getitimer işlevi tür türündeki zamanlayıcı ile ilgili bilgileri eski ile gösterilen yapı içinde döndürür.
Dönüş değeri ve hata durumları setitimer ile aynıdır.
- ITIMER_REAL
Bu sabit setitimer ve getitimer işlevlerinin tür argümanında kullanıldığında gerçek zamanlı bir zamanlayıcı belirtir.
- ITIMER_VIRTUAL
Bu sabit setitimer ve getitimer işlevlerinin tür argümanında kullanıldığında sanal bir zamanlayıcı belirtir.
- ITIMER_PROF
Bu sabit setitimer ve getitimer işlevlerinin tür argümanında kullanıldığında gerçek bir profil zamanlayıcı belirtir.
unsigned int alarm | (unsigned int saniye) |
işlev
alarm işlevi gerçek zamanlı zamanlayıcıyı saniye saniyede zamanaşımına uğrayacak şekilde ayarlar. Mevcut bir alarmı iptal etmek isterseniz, işlevi saniye argümanında sıfır değerini aktararak çağırmanız yeterlidir.
Dönüş değeri, önceki alarmın kalan süresidir. Daha önce bir alarm yoksa işlev sıfır ile döner.
alarm işlevi setitimer kuralları ile şöyle tanımlanabilirdi:
unsigned int
alarm (unsigned int seconds)
{
struct itimerval old, new;
new.it_interval.tv_usec = 0;
new.it_interval.tv_sec = 0;
new.it_value.tv_usec = 0;
new.it_value.tv_sec = (long int) seconds;
if (setitimer (ITIMER_REAL, &new, &old) < 0)
return 0;
else
return old.it_value.tv_sec;
}
Sürecinizin belli bir süre beklemesini isterseniz
sleep işlevini kullanmalısınız. Bkz.
Uyku.
Zamanlayıcı zamanaşımına uğrar uğramaz sinyalin gelmesini beklememelisiniz. Çok işlemcili ortamlarda genellikle biraz gecikme olur.
| Taşınabilirlik Bilgisi |
---|
setitimer ve getitimer işlevlerinin BSD Unix'den türetilmiş olmasına karşın alarm işlevi POSIX.1 standardında belirtilmiştir. setitimer işlevi daha güçlü olduğu halde alarm işlevi daha yaygın olarak kullanılır. |