C Programmeren

Hoe te gebruiken Selecteer systeemoproep in C

Hoe te gebruiken Selecteer systeemoproep in C
De systeemaanroep select() stelt een systeem in staat om verschillende bestandsdescriptors bij te houden. De geselecteerde systeemaanroep wacht dus tot een van de descriptoren of een geheel "klaar" blijkt te zijn voor een bepaald type I/O-activiteit (bijv.g., invoer mogelijk). Als het daaropvolgende I/O-proces (e.g., read(2)) ondanks blokkering kan worden uitgevoerd, wordt de bestandsdescriptor in staat geacht. De methode select() beschrijft of een documentdescriptor beschikbaar is om te lezen, voorbereid is om te schrijven of zich in een uitzonderingsstatus bevindt. Stel dat de vermelde situatie onwaar is voor alle vermelde bestandsdescriptors. In dat geval zijn de select() systeemaanroepblokken vóór de genoemde omstandigheden geldig voor minimaal één van de genoemde documentdescriptors, gelijk aan het genoemde interval van time-out.

Voorbeeld voor Select System Call:

Laten we een eenvoudig voorbeeld hebben om de werking van een geselecteerde systeemaanroep te bekijken. Open de opdrachtregelshell met behulp van de "Ctrl+Alt+T".Zorg er na het openen van de terminal voor dat u een C-taalcompiler op uw systeem hebt geïnstalleerd, want de code werkt niet zonder. Als je er geen hebt, probeer dan de onderstaande opdracht om dit te doen.

$ sudo apt install gcc

Als u de Linux select-systeemaanroep wilt zien werken, moet u het manpages-dev-pakket op uw systeem hebben geïnstalleerd volgens de onderstaande opdracht. Schrijf uw gebruikerswachtwoord om door te gaan.

$ sudo apt install manpages-dev

U kunt de syntaxis en werking van de geselecteerde systeemaanroep zien met behulp van de onderstaande "man" -opdracht.

$ man 2 selecteer

De output man-pagina voor de geselecteerde systeemaanroep wordt hieronder getoond:. Sluit het af door op de "q"-toets te drukken.

Standaarddirectories, command shell terminal & pseudo-terminal applicaties, STREAMS gecentreerde documenten, FIFO's, inclusief pipes, worden allemaal ondersteund door de select() module. De activiteit van select() op documentdescriptors die verwijzen naar deze andere bestandsindelingen is onbekend. Dus hieronder is de uitleg van de Select systeemaanroep.

De beschrijving van de syntaxis die in de bovenstaande afbeelding wordt weergegeven, wordt hieronder beschreven:.

Hierboven staat de bibliotheek die moet worden opgenomen in de C-code tijdens het gebruik van de geselecteerde systeemaanroep. Als deze er niet bij zit, werkt de code niet.

De nfds statement definieert de bestandsdescriptorset die zal worden geëvalueerd. De methode select() controleert bestandsdescriptors tussen 0 en nfds-1.

Terwijl readfds is niet null, het verwijst naar een array van vorm fd_set die definieert welke documentdescriptors moeten worden getest op leesgereedheid bij invoer en welke documentdescriptors allemaal moeten worden ingesteld om te lezen bij uitvoer.

Wanneer de schrijffds parameter is niet leeg, het verwijst naar een entiteit van de vorm fd_set die definieert welke documentdescriptors moeten worden getest op gereedheid om in te schrijven bij invoer. De documentbeschrijvingen moeten voorbereid zijn om op output te schrijven.

Terwijl de errorfds parameter is niet leeg, het verwijst naar een object van soort fd_set, dat bepaalt welke documentdescriptors moeten worden getest op het wachten op de foutstatus bij invoer; ook moeten de documentbeschrijvingen worden geverifieerd bij de uitvoer.

De parameters readfds, writefds en errorfds worden bijgewerkt na voltooiing om aan te geven dat documentdescriptors zijn voorbereid om gelezen te worden, volledig voorbereid zijn om te schrijven of zelfs een uitzonderingsstatus hebben die dienovereenkomstig wacht. Als het volgende bit op invoer is gefixeerd en de relevante situatie geldt voor elke bestandsdescriptor iets onder nfds, zou het volgende bit op effectieve prestatie worden geplaatst.

Hoewel de time-outparameter niet echt leeg is, leidt het tot een structuur-timeval-entiteit die de ultieme tijd bepaalt om je vuur vast te houden voor de keuze om te eindigen. Select() belemmert niet echt als een dergelijke time-outparameter leidt tot een structure timeval-object met 0 elementen. Select() stopt tenzij een voorval toestaat dat een van de filters wordt opgehaald met een waar (niet-nul) resultaat, ongeacht of de time-outinstructie een lege verwijzing is. Select() slaagt effectief en produceert 0 wanneer de wachttijd eindigt, zelfs voordat het optreden plaatsvindt, waarvoor mogelijk een van de verschillende maskers moet worden aangepast naar een waarde die niet nul is.

Deze macro elimineert de verzameling (wist alle documentbeschrijvingen). Het kan worden gebruikt als de allereerste zet in de initialisatie van een documentdescriptorverzameling.

De documentdescriptor fd wordt door deze macro aan de verzameling toegevoegd. Het gebruik van een documentdescriptor voor een verzameling die al bestaat, is niet-operationeel en leidt daarom niet tot een uitzonderingsfout.

De documentdescriptor fd wordt door deze macro uit de collectie verwijderd. Een uit de collectie verwijderde bestandsdescriptor die niet bestaat, is niet-operationeel en resulteert daarom niet in een uitzondering.

De systeemaanroep select() wijzigt de informatie of gegevens van de collecties volgens de hierboven genoemde regels. De FD ISSET()-macro kan worden verwijderd door select() aan te roepen om te zien of een documentdescriptor beschikbaar blijft in een verzameling.

Laten we een nieuw C-type bestand maken met de naam "new.c” zoals hieronder.

$ nano nieuw.c

De GNU-editor is geopend. Schrijf de onderstaande code erin. De code bevat headers, hoofdfunctie met enkele bestandsdescriptors zoals hierboven beschreven elaborate. Het bevat ook een structuur voor de tijdsintervalwaarde. Vervolgens hebben we de select-systeemaanroep gebruikt om te controleren op de fout in de "if" -instructie. Druk op "Ctrl+S" om deze code op te slaan en "Ctrl+X" om de editor te verlaten.

Compileer nu de code met behulp van de "gcc" -instructie.

$ gcc nieuw.c

Voer de code uit en voeg geen invoer toe. De uitvoer zal zeggen "selecteer time-out".”

$ ./een.uit

Voer nogmaals de code uit en geef wat invoer in de terminal, e.g., “Aqsa.Er wordt weergegeven dat de "gegevens beschikbaar zijn".”

Conclusie:

We hebben de select-systeemaanroep geïmplementeerd op de Ubuntu 20.04 Linux-systeem. De code zou op alle distributies van Linux gelijk en correct moeten werken. Ik hoop dat je dit artikel gemakkelijk te implementeren en te begrijpen vindt.

Hoe de muisaanwijzer en cursorgrootte, kleur en schema op Windows 10 te veranderen
De muisaanwijzer en cursor in Windows 10 zijn zeer belangrijke aspecten van het besturingssysteem. Dit geldt ook voor andere besturingssystemen, dus i...
Gratis en open source game-engines voor het ontwikkelen van Linux-games
Dit artikel behandelt een lijst met gratis en open source game-engines die kunnen worden gebruikt voor het ontwikkelen van 2D- en 3D-games op Linux. E...
Shadow of the Tomb Raider voor Linux-zelfstudie
Shadow of the Tomb Raider is de twaalfde toevoeging aan de Tomb Raider-serie - een actie-avonturengame-franchise gemaakt door Eidos Montreal. De game ...