select işlevi, çağrıldığı süreci belirtilen dosya tananıtıcı kümesindeki tanıtıcılarda bir etkinlik olana kadar ya da belirtilen zamanaşımı süresi dolana kadar bekletir.
oku-dt argümanı ile okumaya hazır tanıtıcılar, yaz-dt argümanı ile yazmaya hazır tanıtıcılar belirtilir. diğer-dt ile belirtilen tanıtıcılar ise olağandışı durumlara göre denetlenir. İlgilenmediğiniz durumla ilgili olan argümana boş gösterici atayabilirsiniz.
Bir dosya gösterici eğer bir
read çağrısı engellenmeyecekse okumaya hazır olarak kabul edilir. Engellenme durumları olarak okuma başlangıcının dosyanın sonunda olması veya raporlanacak bir hatanın varlığından bahsedilebilir. Bir sunucu soketi de
accept ile
kabul edilebilen bir bağlantı askıdaysa okumaya hazır kabul edilir. Bir istemci soketi ise
bağlantı tamamen kurulduğunda yazmaya hazır olur.
"Olağandışı durumlar" hata anlamında değildir; hatalar oluştuğunda sistem çağrıları tarafından raporlanır ve bunların tanıtıcının durumu ile ilgisi yoktur. Olağandışı durumlar bir soket üzerinde acil bir iletinin varlığı gibi durumlardır. (Acil iletiler hakkında
Soketler bölümünde bilgi bulabilirsiniz.)
select işlevi sadece ilk dtsayısı dosya tanıtıcısını denetler. dtsayısı olarak FD_SETSIZE çok kullanışlıdır.
süre azami bekleme süresini belirtir. Bir boş gösterici belirtmişseniz bir süre sınırı olmaksızın bir dosya tanıtıcı hazır olana kadar işlev bekleyecektir. Bunun olmaması için
struct timeval biçiminde bir
zamanaşımı süresi belirtmelisiniz. Beklemeden hangi dosya tanıtıcıların hazır olduğuna bakmak isterseniz buraya süre olarak sıfır (
struct timeval'ın üyelerinin hepsi sıfır) belirtebilirsiniz.
İşlevin normal dönüş değeri tüm kümelerde hazır olan dosya tanıtıcıların sayısıdır. Küme argümanlarının her birinde hazır olan tanıtıcılarla ilgili bilgi bulunur. select döndükten sonra belli bir dosya tanıtıcının girdi için hazır olup olmadığını
FD_ISSET (dosyatanıtıcı, oku-dt) ile öğrenebilirsiniz.
select zamanaşımına uğramışsa sıfır ile döner.
Herhangi bir sinyal
select işlevinin anında dönmesine sebep olur. Yazılımınızda sinyaller kullanılıyorsa belirttiğiniz zamanaşımı süresince işlevin beklemede kalması mümkün olmayabilir. Bu sürenin mutlaka beklenmesini istiyorsanız
EINTR durumunun varlığına bakarak o anki zaman değeri ile karşılaştırarak yeni bekleme süresini hesaplayıp çağrıyı yinelemelisiniz. Bunun bir örneği aşağıda verilmiştir, ayrıca
Sinyallerle Kesilen İlkeller bölümüne de bakın.
Bir hata oluşursa işlev -1 ile döner ve dosya tanıtıcı kümesi argümanlarında bir değişiklik yapmaz. Aşağıdaki errno hata durumları bu işlev için tanımlanmıştır:
- EBADF
Dosya tanıtıcı kümelerinden biri geçersiz bir dosya tanıtıcı içeriyor
- EINTR
- EINVAL
süre argümanı geçersiz; üyelerinden biri ya negatif ya da çok büyük