GNU/Linux >> Znalost Linux >  >> Linux

Proč se v Linuxu používá select

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 do nfds-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


Linux
  1. Linux – všechno je soubor?

  2. Zkrácení souboru během jeho používání (Linux)

  3. Proč máme v LINUXu 3 typy X-výběrů?

  1. Oprávnění souborů v Linuxu – čtení/zápis/spouštění

  2. 10 praktických příkladů příkazu Vyjmout v Linuxu pro výběr sloupců souboru

  3. Proč potřebujeme soubor .so.1 v Linuxu?

  1. Proč na Linuxu používám exa místo ls

  2. Jak přesunout soubor v Linuxu

  3. Proč se rsync nedaří zkopírovat soubory z /sys v Linuxu?