Programy, které chtějí pokračovat v běhu také čtení interaktivního uživatelského vstupu musí být vícevláknové nebo potřebují číst vstupní proudy pečlivě a konkrétně podmíněně.
Select(2)
lze použít k implementaci druhého návrhového vzoru. Může určit, zda lze číst vstup bez blokování celé aplikace.
select()
systémové volání vám řekne, zda existují nějaká data ke čtení na deskriptorech souborů, která vás zajímají. Přísně jde o to, zda operace čtení na deskriptoru souboru bude blokovat nebo ne.
Pokud spustíte read()
na deskriptoru souboru – jako je ten připojený k sériovému portu – a nejsou tam žádná data ke čtení, pak se volání zablokuje, dokud nebudou nějaká data ke čtení. Programy používající select()
nepřejete si být takto blokováni.
Také se ptáte:
Proč musíme zvýšit deskriptor souboru o 1 a předat jej, zatímco já předávám deskriptor souboru nastavený již na
select
?
To pravděpodobně určuje velikost FD_SET. První argument pro select()
je známý jako nfds
a POSIX říká:
nfds
argument určuje rozsah testovaných deskriptorů. Prvnínfds
deskriptory se kontrolují v každé sadě; tj. deskriptory od nuly donfds-1
v souborech deskriptorů se musí prozkoumat.
Chcete-li tedy otestovat deskriptor souboru n
, hodnota v nfds
musí být alespoň n+1
.
Volání select použijete, když musíte neustále sledovat deskriptory souborů, dokud se nepřipraví na nějaké IO bez blokování.
Obecně se používá, když chcete IO (např. read() )neblokující, přečtěte si :man page
Přečtěte si také související API