Bir Alarmın Ayarlanması
Önceki XXI. Oylum - Tarih ve Zaman Sonraki
Bir Alarmın Ayarlanması
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:
  • Bir gerçek zamanlı zamanlayıcı kalan süreyi sayar. Bu zamanlayıcı zamanaşımına uğradığında sürece bir SIGALRM sinyali gönderir.
  • Bir sanal zamanlayıcı süreç tarafından kullanılan işlemci süresini sayar. Bu zamanlayıcı zamanaşımına uğradığında sürece bir SIGVTALRM sinyali gönderir.
  • Bir profil zamanlayıcı hem süreç tarafından kullanılan işlemci süresini hem de sistemin süreç adına kullandığı işlemci süresini sayar. Bu zamanlayıcı zamanaşımına uğradığında sürece bir SIGPROF sinyali gönderir.
    Bu zamanlayıcı yorumlayıcılarda profil çıkarma için kullanışlıdır. Zamanlayıcı mekanizmasının birim sayma süresi doğal kodun profilinin çıkarılması için gereken hassasiyete sahip değildir.
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.
struct itimerval
veri türü
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;
}
alarm işlevinin kullanım örneğini Dönen Sinyal Yakalayıcılar bölümünde bulabilirsiniz.
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.
Önceki Üst Ana Başlık Sonraki
Zaman İşlevleri Örneği Başlangıç Uyku
Bir Linux Kitaplığı Sayfası