Příklad pro Select System Call:
Podívejme se na jednoduchý příklad, jak zkontrolovat fungování vybraného systémového volání. Otevřete prostředí příkazového řádku pomocí kláves „Ctrl + Alt + T.„Po otevření terminálu se ujistěte, že máte ve svém systému nainstalován překladač jazyka C, protože kód bez něj nebude fungovat. Pokud žádný nemáte, vyzkoušejte následující příkaz.
$ sudo apt nainstalovat gcc
Chcete-li vidět, že systémové volání systému Linux select funguje, musíte mít ve svém systému nainstalovaný balíček manpages-dev podle níže uvedeného příkazu. Chcete-li pokračovat, zadejte své uživatelské heslo.
$ sudo apt install manpages-dev
Syntaxi a fungování vybraného systémového volání můžete zobrazit pomocí níže uvedeného příkazu „man“.
$ man 2 vybrat
Níže je uvedena výstupní stránka manuálu pro vybrané systémové volání. Ukončete jej stisknutím klávesy „q“.
Standardní adresáře, terminál příkazového prostředí a aplikace pseudoterminálu, dokumenty se středem STREAMS, FIFO, včetně kanálů, jsou podporovány modulem select (). Aktivita select () na deskriptorech dokumentů odkazujících na tyto jiné formáty souborů není známa. Níže je tedy vysvětlení systémového volání Select.
Popis syntaxe zobrazené na obrázku výše je popsán níže.
Nahoře je knihovna, která má být zahrnuta do kódu C při používání vybraného systémového volání. Pokud to není zahrnuto, kód nefunguje.
The nfds Příkaz definuje sadu deskriptorů souborů, která bude vyhodnocena. Metoda select () kontroluje deskriptory souborů mezi 0 a nfds-1.
Zatímco readfds není null, odkazuje na pole formuláře fd_set, které definuje, které deskriptory dokumentů by měly být testovány na připravenost ke čtení na vstupu a které deskriptory dokumentů by měly být nastaveny na čtení na výstupu.
Když writefds parametr není prázdný, odkazuje na entitu formuláře fd_set, která definuje, které deskriptory dokumentů by měly být testovány na připravenost na vstup při vstupu. Deskriptory dokumentů by měly být připraveny k sestavení na výstupu.
Zatímco errorfds parametr není prázdný, odkazuje na objekt druhu fd_set, který určuje, které deskriptory dokumentů by měly být testovány na čekání na chybový stav věcí na vstupu; deskriptory dokumentů by také měly být ověřeny na výstupu.
Parametry readfds, writefds a errorfds se po dokončení aktualizují, což znamená, že deskriptory dokumentů jsou připraveny na čtení, plně připraveny na zápis nebo dokonce čekají na stav výjimky. Pokud je následující bit fixován na vstupu a příslušná situace je platná pro každý deskriptor souboru o něco méně než nfds, následný bit by byl umístěn na efektivní provedení.
I když parametr časového limitu není opravdu prázdný, vede k entitě časové struktury struktury, která určuje nejvyšší čas k udržení vašeho ohně, aby volba skončila. Select () zcela nebrání tomu, aby takový parametr časového limitu vedl k objektu časové struktury s 0 prvky. Select () zastaví, pokud výskyt neumožňuje načíst jeden z filtrů se skutečným (nenulovým) výsledkem, ať je příkaz timeout prázdným odkazem. Select () úspěšně uspěje a vytvoří 0, když čekací doba končí ještě předtím, než dojde k výskytu, což může vyžadovat úpravu jedné z několika masek na nenulovou hodnotu.
Toto makro vylučuje kolekci (vymaže všechny deskriptory dokumentů). Může být použit jako první krok v inicializaci kolekce deskriptorů dokumentů.
Deskriptor dokumentu fd je přidán do kolekce tímto makrem. Použití deskriptoru dokumentu do kolekce, která již existuje, by bylo nefunkční, a proto nevede k chybě výjimky.
Toto makro je deskriptor dokumentu fd odebrán ze sbírky. Deskriptor souboru vyřazený z kolekce, který neexistuje, je neprovozní, a proto nevede k výjimce.
Systémové volání select () mění informace nebo data kolekcí podle výše zmíněných pravidel. Makro FD ISSET () lze zrušit vyvoláním select (), abyste zjistili, zda deskriptor dokumentu zůstává k dispozici v kolekci.
Vytvořme nový soubor typu C s názvem „nový.c “jak je uvedeno níže.
$ nano nové.C
Byl otevřen editor GNU. Napište do ní pod kód. Kód obsahuje záhlaví, hlavní funkci s některými deskriptory souborů, jak je uvedeno výše. Obsahuje také strukturu pro hodnotu časového intervalu. Pak jsme pomocí select system call zkontrolovali chybu ve výpisu „if“. Stisknutím „Ctrl + S“ uložte tento kód a klávesou „Ctrl + X“ ukončete editor.
Nyní kód zkompilujte pomocí instrukce „gcc“.
$ gcc nové.C
Spusťte kód a nepřidávejte žádné vstupy. Na výstupu bude uvedeno „vybrat časový limit.“
$ ./A.ven
Opět spusťte kód a zadejte nějaký vstup do terminálu, např.G., "Aqsa.".„Výsledkem bude, že„ data jsou k dispozici.“
Závěr:
Implementovali jsme vybrané systémové volání na Ubuntu 20.04 Systém Linux. Tento kód by měl fungovat na všech distribucích Linuxu stejně a správně. Doufám, že tento článek bude snadno implementovatelný a srozumitelný.