select() ile Giriş Beklemek

Ne hasta bekler sabahı,
Ne taze ölüyü mezar,
Ne de şeytan bir günahı,
Seni beklediğim kadar.*


select ile tanışmamız döngü içinde cin'in bloklayıcı etkisini kırmak için basit bir yöntem bulamadığım bir kodla uğraşırken gerçekleşmişti. İstediğim sadece kullanıcıya giriş yapması için n saniye vermek ve bu süre sonrasında da kullanıcı giriş yapsın ya da yapmasın döngünün tamamlanmasıydı. Döngü içinde zaman aşımlı kullanıcı girişi için farklı ve daha iyi çözümler olduğu söyleylendiyse de benim için şu an fazlaca gelişmiş olduklarından ilk tanıştığım select ile devam etmeye karar verdim şimdilik.

select daha çok ağ programlamayla ilgili olsa da eğer benim gibi cin'e basit bir yöntemle zaman aşımı desteği ekleyemediyseniz siz de yararlanabilirsiniz.

Bloklama kavramının başka tanımları olsa da benim için şu anlama geliyor: terminal arayüzü üzerinde kullanıcı ile etkilişime girmek için cin kullanıldığı zaman programın devam etmesinin kullanıcıya bağımlı olması. Eğer kullanıcı giriş yaparsa program devam edebilir, eğer kullanıcı giriş yapmazsa program sonsuza kadar olduğu yerde bekler.

select tanımlanan bir girişte bir faaliyet olana ya da belirtilen süre dolana kadar işlem çağırımını engelleyen bir fonksiyondur.

select() fonksiyonu (synchronous I/O multiplexing, eş zamanlı g/ç çoklama) normal dosyaları, terminal ve pseudo-terminal cihazlarını, akış tabanlı (STREAMS-based) dosyaları FIFO'ları, boruları (pipes) ve soketleri desteklemektedir.

Önceki Özgün Unix Tanımlamalarına göre select() fonksiyonu sys/time.h başlığında tanımlanmıştı. Şimdi select(), pselect() ve bunlarla ilgili belirtimler sys/select.h başlığında tanımlıdır. Geriye uyumluluk için sys/time.h başlığının sys/select.h başlığını içermesi (çağırması) sağlanmıştır.

select (int nfds, fd_set *read-fds, fd_set *write-fds, fd_set *except-fds, struct timeval *timeout)

read-fds argümanı kontrol edilenin okuma için hazır olup olmadığını, write-fds argümanı yazmaya hazır olup olmadığını, except-fds ise istisnai durumların olup olmadığını kontrol etmek için kullanılabilir. Kontrol edilmek istenmeyen durumlar için olan ilgili argümanlar kullanılmayabilir.

timeout beklenecek en fazla süreyi tanımlar. Eğer NULL olarak tanımlanırsa izlenen giriş çıkışlardan biri hazır olana kadar bloklama gerçekleşir. Zamanı tanımlamak için struct timeval biçimi kullanılabilir. Eğer struct timeval ile 0 saniyelik bir zaman aşımı tanımlanırsa, select() hemen zaman aşımına uğrar.

select'in normal dönüş değeri hazır olan izlenenlerin toplam sayısıdır. Eğer select tanımlanan zaman dolduğu için dönerse, dönüş değeri sıfırdır.

Aşağıdaki örnekte giriş için beklenirken zaman aşımını nasıl kurabileceğinizi görebilirsiniz. input_timeout  fonksiyonu işlem çağırımını giriş hazır olana ya da zaman dolana kadar engeller:



Aşağıdaki örnek standart girişten gelecek herhangi bir giriş için 2.5 saniye bekler:




KAYNAKLAR
Waiting for Input or Output
select() -Synchronous I/O Multiplexing
socket IPC..
man select

Yorumlar

Bu blogdaki popüler yayınlar

Fedora 24'te GRUB 2 Önyükleyici Temasını Değiştirme

Diğer Dillerde Hoşçakal

Müfettiş Gadget'taki Kötü Adamın Yüzü Açığa Çıkmış