Uyku
Önceki XXI. Oylum - Tarih ve Zaman Sonraki
Uyku
sleep işlevi yazılımınızın kısa bir süre için beklemeye alınmasını sağlayan basit bir yöntem sunar. Yazılımınız sinyalleri kullanmıyorsa (sonlanma hariç) sleep ile belli bir süre bekleme sağlayacağınızı varsayabilirsiniz. Ancak, eğer bir sinyal gelirse sleep daha erken dönebilir. Bekleme süresinin sinyallerden bağımsız olmasını isterseniz select (bkz. Girdi ve Çıktının Beklenmesi) işlevini beklenecek herhangi bir tanımlayıcı belirtmeden kullanmalısınız.
unsigned int sleep
(unsigned int saniye)
işlev
sleep işlevi bir sinyal alınmadıkça çağrıldığı süreci saniye saniye bekletir.
sleep işlevi istenen süreyi tamamlamışsa, sıfır ile döner; bir sinyal nedeniyle tamamlayamamışsa kalan süreyi belirten bir sayı ile döner.
sleep işlevi unistd.h başlık dosyasında bildirilmiştir.
sleep işlevinin dönüş değerini kullanarak ve sıfırdan farklıysa çağrıyı tekrarlayarak bekleme süresinin dolmasını sağlamaya karşı bir direnç oluşur. Bu çalışma sonucunda elde edilen sonucun doğruluğu sinyallerin geliş sıklığına göre değişir. Her sinyal alınışında araya ek birkaç saniye eklenecektir. Çok sık aralıklarla birkaç sinyalin birden gelmesi kötü bir şans olurdu, bu durumda bekleme süresinin uzunluğunun ya da kısalığının bir sınırı olmayacaktır.
Bunun yerine yazılımın beklemeyi sonlandıracağı zamanı bir mutlak zamana ayarlayın. Bu bir saniyeden fazla şaşmaz. Biraz daha fazla bir çalışma ile daha kesin bir bekleme süresini select işlevini kullanarak sağlayabilirsiniz. (Bu durumda da makine uygulamanıza adanmamışsa ağır sistem yükleri kaçınılmaz ek gecikmeler oluşturur ve bundan kaçınmanın bir yolu yoktur.)
Bazı sistemlerde, sleep işlevi yazılımın doğrudan SIGALRM kullanmasına bağlı olarak tuhaf şeyler yapabilir. sleep çağrıldığı sırada SIGALRM sinyalleri yoksayılsa ya da engellense bile, bir SIGALRM sinyali alındığında işlev zamanaşımı süresi bitmeden dönecektir. SIGALRM sinyalleri için bir sinyal eylemci oluşturursanız ve sürecin uykusu esnasında bir SIGALRM sinyali gelirse, bu, eylemciniz çağrılmadan önce sleep işlevinin dönmesine sebep olur. Eğer sleep işlevi, eylemcisi bir alarm isteğinde bulunan ya da SIGALRM sinyalinin eylemini değiştiren bir sinyalle kesildiğinde bu eylemci ile sleep işlevi birbiriyle etkileşecektir.
GNU sisteminde, sleep işlevi SIGALRM'la etkileşecek şekilde çalışmadığından sleep ve SIGALRM aynı yazılımda güvenle kullanılabilir.
int nanosleep
(const struct timespec *istenen,
 struct timespec       *kalan)
işlev
Bir saniyelik çözünürlük yetersizse nanosleep işlevi kullanılabilir. İsminden de anlaşılacağı üzere uyku süresi nanosaniyeler cinsinden belirtilebilir. Asıl uyku süresini, sistemin uygulayabileceği çözünürlüğün katları olan bir tamsayıya yuvarlanacağından istenenden biraz daha uzun olabilir.
struct timespec yapısı Süre bölümünde açıklanmıştır.
*istenen uyku süresini belirtmek için kullanılır.
İşlev kesintiye uğramadan istenen süreyi doldurursa sıfır ile döner, aksi takdirde kalan süre ile ilgili bilgileri *kalan içinde saklayarak döner. İşlev -1 değeri ile döndüğünde errno değişkeninde aşağıdaki değerler atanabilir.
EINTR
Bir sinyal alındığından çağrı durduruldu. İşlevin kalan parametresi bir boş gösterici değilse kalan süre ile ilgili bilgiler kalan ile gösterilen yapıya yerleştirilir.
EINVAL
istenen parametresi bir kuraldığı değer içeriyor. Değer ya negatif ya da 1000 milyona eşit veya büyük.
Bu işlev çok evreli yazılımlarda bir iptal noktasıdır. nanosleep çağrısı sırasında evre bazı özkaynakları ayırıyorsa (bellek, dosya tanıtıcı, semafor,v.s) bu bir sorun olabilir. Evre özkaynak ayırdıktan sonra bir iptal alırsa bu özkaynaklar uygulama sonlandırılana kadar ayrılmış olarak kalacaktır. İptal eylemcileri kullanarak nanosleep çağrılarının oluşturacağı bu olumsuz durum engellenmelidir.
nanosleep işlevi time.h başlık dosyasında bildirilmiştir.
Önceki Üst Ana Başlık Sonraki
Bir Alarmın Ayarlanması Başlangıç XXII. Oylum - Özkaynak Kullanımı ve Sınırlaması
Bir Linux Kitaplığı Sayfası