C Programmeren

Poll-systeemoproep gebruiken in C

Poll-systeemoproep gebruiken in C
Met de functie poll() kunnen programma's invoer en uitvoer multiplexen via een reeks bestandsdescriptors. Met andere woorden, de poll()-systeemaanroep is analoog aan de select()-systeemaanroep bij het werken, aangezien deze zijn vuur behoudt voor een van de verschillende bestandsdescriptors door beschikbaar te worden voor I/O. Poll() onderzoekt de toegewezen documentdescriptor voor het weergeven van de gebeurtenis(sen) in incidenten voor elk element van de array dat ernaar verwijst door bestandsdescriptors. De poll()-methode kan bepalen naar welke van de bestandsdescriptors een programma details zal lezen of schrijven die deze incidenten hebben gezien. In deze handleiding gebruiken we Ubuntu 20.04 om het concept van poll() systeemaanroep op Linux stap voor stap te begrijpen.

Syntaxis:

int poll (struct pollfd *ufds, unsigned int nfds, int time-out);

Het argument "fds" bepaalt de documentdescriptoren die moeten worden gecontroleerd, evenals de incidenten die van belang zijn voor elk. Het is een verwijzing naar ofwel een array die één element heeft voor elke open documentdescriptor. De elementen van de array zijn pollfd-structuren, waarbij fd een open documentdescriptor aanduidt, en alle happenings en re-events, gewoonlijk bitmaskers genoemd, worden gegenereerd door een samensmelting van de overeenkomstige gebeurtenisvlaggen te creëren:

POLLIN:

Afgezien van gegevens met een hoge prioriteit, kunnen informatiegegevens worden uitgelezen zonder dat ze zelfs maar worden geblokkeerd. Als het antwoordbericht een grootte van nul heeft, wordt dit vlagsignaal ook gegenereerd voor de STREAMS in revents. Deze vlag heeft dezelfde betekenis als POLLRDNORM | POLLRDBAND.

POLLRDNORM:

Zonder onderbreking kunnen gewone informatiegegevens worden uitgelezen. Informatie over zorgband 0 met primaire prioriteit kan worden gelezen ondanks onderbreking voor STREAMS. En als het antwoordbericht geen lengte heeft, wordt dit signaal gegenereerd in re-events.

POLLRDBAND:

Primaire zorggegevens worden uitgelezen ondanks vertragingen. Informatie over prioriteitsbereiken groter dan nul kan worden gelezen ondanks interferentie in STREAMS. En als de berichtreactie van nul duur is, wordt dit signaal in revents gepropageerd.

POLLPRI:

Er kunnen enkele uitzonderingen zijn op de documentdescriptor. Informatie met een topprioriteit kan worden gelezen zonder te worden geblokkeerd. Als de respons een duur van nul heeft, wordt dit signaal ook gepropageerd voor STREAMS in revents.

POLLOUT:

Gebruikers kunnen uitschrijven met behulp van de POLLOUT-vlag. Beroofd van stoppen, kunnen typische gegevens worden opgenomen. Informatie over voorkeursband 0 kan worden opgenomen ondanks de onderbreking in STREAMS.

POLLWRNORM:

Het werkt hetzelfde als POLLOUT.

POLLWRBAND:

De gegevens met de meeste prioriteit worden geschreven met deze vlag. Informatie over voorkeursbereiken groter dan nul voor STREAMS kan worden opgenomen zonder te worden geblokkeerd. Deze activiteit evalueert alleen banden waarnaar al minimaal één keer is geschreven, aangezien er geen voorkeursband is geschreven op deze STREAM.

POLLER:

Het is een foutconditie en treedt alleen op wanneer het systeem of de stroom een ​​probleem heeft ondervonden. Dit symbool is alleen van toepassing op het revents bitmasker; tijdens de activiteiten deelnemer, wordt het over het hoofd gezien.

POLLHUP:

Het specificeert de ophangconditie en treedt alleen op wanneer de verbinding met het systeem is uitgeschakeld. Dit voorval en POLLOUT zijn even compatibel; als er eenmaal een probleem is ontstaan, wordt er nooit een stream geschreven.

POLLNVAL:

Dit specificeert het ongeldige of ongebruikelijke verzoek. Deze activiteit sluit deelname aan POLLIN, POLLRDNORM, POLLRDBAND of POLLPRI echter niet uit. Dit symbool is alleen van toepassing op het revents bitmasker; het wordt over het hoofd gezien bij de deelnemer aan het evenement.

Voorbeeld van een oproep via een pollingsysteem:

Het vervult dezelfde rol als select(), hoewel op grotere schaal. Poll() is beschikbaar op elke op Glibc gebaseerde Linux-machine. De oudere kernels imiteren poll() met select() in de hele C-bibliotheek. Programma's zouden echter geen onderscheid moeten maken. Hier is een voorbeeld van hoe poll() aanvoelt. Open dus eerst de opdrachtregelterminal met de sneltoets "Ctrl+Alt+T"."Na het openen moeten we een C-type bestand maken om er een C-type code in te schrijven. Hiervoor hebben we de nano-editor gebruikt. Dus, probeer de onderstaande nano-opdracht in de terminal samen met de naam van het C-bestand.

$ nano nieuw.c

Nu is de nano-editor voor het C-bestand "nieuw" geopend. Je moet er eerst enkele bibliotheken in opnemen, vooral de "poll".h” bibliotheek. De hoofdfunctie is gespecificeerd met een integer retourtype met twee argumenten in de parameter, e.g., argc en argv. Vervolgens hebben we een bestandsdescriptor fd gedeclareerd en een karaktertypearray met de naam “buf.Daarna is er een structuurtypevariabele gedefinieerd met de naam pollfd pfds van grootte 2. Vervolgens is een open systeemaanroep gedeclareerd om de waarde uit de tekentypearray te halen en deze toe te wijzen aan de bestandsdescriptor "fd" zoals te zien in de afbeelding. Terwijl de bestandsdescriptor "1" is, wordt de structuur "pfds" bijgewerkt met enkele gegevens erin met behulp van de POLLIN-vlag erin. Nu hebben we een poll() systeemaanroepfunctie gedefinieerd. De eerste parameter van de poll()-systeemaanroep is de ufds-structuur die in de code wordt gebruikt. De tweede parameter specificeert het totaal van pollfd-structuren in de fds-reeks.

En de laatste parameter toont de time-outwaarde van het gehele type voor de poll-systeemaanroep. Als de pfds revents zijn en opgeteld met een waarde van 0, dan zal de read system call de data uit de buffer uitlezen. De "if" -instructie wordt gebruikt om te controleren of de leesinstructie zijn waarde heeft geretourneerd naar een geheel getal en om gegevens te schrijven. Als de struct "pfds" zich op positie "1" bevindt tijdens revent en het invoeren van de gegevens, zal de leessysteemaanroep de gegevens uit een buffer gebruiken terwijl de "fd" -descriptor wordt gebruikt.

Bewaar het nieuwe.c-bestand en sluit het. Compileer het nu met de gcc-compiler.

$ gcc nieuw.c

Tijdens het uitvoeren van deze code hebben we gegevens toegevoegd aan een peiling om uit te lezen, en het schrijft opnieuw gegevens zoals in de onderstaande uitvoer:.

$ ./een.uit

Conclusie:

In dit hierboven beschreven artikel hebben we de systeemaanroep poll() in C-taal besproken. Ik hoop dat je deze tutorial nuttig en efficiënt vindt tijdens het werken aan het Linux-besturingssysteem.

Emuleer muisklikken door te zweven met Clickless Mouse in Windows 10
Het gebruik van een muis of toetsenbord in de verkeerde houding of overmatig gebruik kan leiden tot veel gezondheidsproblemen, waaronder spanning, car...
Voeg muisbewegingen toe aan Windows 10 met deze gratis tools
In de afgelopen jaren zijn computers en besturingssystemen sterk geëvolueerd. Er was een tijd dat gebruikers opdrachten moesten gebruiken om door best...
Beheer en beheer muisbewegingen tussen meerdere monitoren in Windows 10
Muisbeheer voor twee schermen laat je muisbewegingen tussen meerdere monitoren controleren en configureren door de bewegingen nabij de grens te vertra...