C ioctl funksjonsbruk

C ioctl funksjonsbruk
De enkle filene til et Linux-basert system kan enkelt leses eller skrives ved hjelp av enkle inngangs- og utgangsoperasjoner. Imidlertid er det noen andre komplekse typer filer som ikke kan nås ved hjelp av enkle inngangs- og utgangsfunksjoner. Vi bruker "IOCTL" -funksjonen til C -programmeringsspråket for alle slike filer. Det står for “Input/ Output Control.”

I denne artikkelen vil vi prøve å forstå formålet med "IOCTL" -funksjonen til C-programmeringsspråket i dybden ved å se på syntaks. Deretter vil vi snakke litt om filtypen som denne funksjonen brukes til, og vi vil også dele med deg stedet der slike filer vanligvis bor. Deretter vil vi demonstrere et eksempel som bruker "IOCTL" -funksjonen til C -programmeringsspråket. Til slutt vil vi diskutere noen feil knyttet til denne spesielle funksjonen.

Formålet med IOCTL -funksjonen i C:

Bortsett fra de vanlige filene til et system, er det noen spesielle formålsfiler, for eksempel enhetsfilene. Enhetsfilene er de som brukes til å samhandle med de forskjellige enhetsdriverne i et system. Du har imidlertid ikke tilgang til disse enhetsfilene ved hjelp av vanlige systemanrop. Det er her "IOCTL" -funksjonen kommer inn i spillet. Denne funksjonen hjelper med å få tilgang til disse filene veldig praktisk. "IOCTL" -funksjonen til C -programmeringsspråket ligger i “IOCTL.h ”headerfil.

Den generelle syntaks for denne funksjonen er vedlagt nedenfor:

#Define "Navn på IOCTL" _IO (NUM1, NUM2, argumenttype)

Her kan "Navn på IOCTL" erstattes av ethvert meningsfylt navn du vil ha for din spesielle funksjon. Deretter kan "_io" være igjen som for en "IOCTL" -funksjon uten parametere; Imidlertid kan du også erstatte den med "_iow", "_ior" og "_iowr" for en "ioctl" -funksjon som har skriving, lesing og skriving og lesing av begge funksjonene. “NUM1” refererer til det unike tallet som er tilordnet vår “IOCTL” -samtale, “NUM2” representerer det unike tallet som er tilordnet "IOCTL" -funksjonen, mens "argumenttypen" refererer til dataene som denne spesielle "IOCTL" -funksjonen er i stand til av å håndtere.

Hvor ligger enhetsfilene på et Linux -system?

Enhetsfilene ligger vanligvis i en Linux-basert systems "/dev" -katalog. For å få tilgang til alle slike filer ved hjelp av "IOCTL" -funksjonen, må du navigere til "/dev" -katalogen til systemet ditt.

Bruk av IOCTL -funksjonen i C:

For å forklare deg i detalj bruken av IOCTL -funksjonen på C -programmeringsspråket, har vi benyttet oss av et enkelt C -program vist på bildene nedenfor. Vi har tenkt å åpne en spesifikk enhetsfil fra systemet vårt og skrive en tilfeldig verdi til det i dette programmet. Etter å ha gjort dette, ønsker vi også å lese en verdi fra samme fil. Du må se på koden for dette eksemplet for å forstå den tydeligere.

Først har vi tatt med en lang liste over biblioteker eller overskriftsfiler hvis funksjoner vil bli brukt i dette C -programmet. Deretter har vi definert "Les" og "Skriv" -funksjonene ved å bruke nøkkelordet "Definer" for å lese og skrive enhetsfilene til systemet vårt. Etter det, innen vår "Main ()" -funksjon, har vi definert en heltallvariabel som heter "Filedescriptor.”Denne filbeskrivelsen vil bli brukt til å sjekke om enhetsfilen vår er åpnet effektivt eller ikke. Deretter har vi definert to andre variabler av int32_t type som heter “val” og “num.”Disse variablene vil ta innspill fra brukeren på kjøretiden og vise den tilsvarende utgangen.

Etter det har vi skrevet ut en melding for å formidle at programmet vårt prøver å åpne enhetsfilen. Deretter ved å bruke den "åpne" funksjonen, har vi forsøkt å åpne ønsket enhetsfil ved å gi den riktige banen, i.e., "/Dev" -katalogen etterfulgt av navnet på ønsket enhetsfil. Etter det ønsket vi å sjekke om filen ble åpnet med suksess eller ikke. For å gjøre det, må vi validere verdien av variabelen "Filedescriptor". Anta at denne verdien vil være mindre enn “0”. I så fall vil en feilmelding bli skrevet ut på terminalen som indikerer at den spesifiserte enhetsfilen ikke kunne åpnes på grunn av en viss feil, og programmet vil avslutte umiddelbart.

Ellers, hvis enhetsfilen åpnes med suksess, vil en melding skrives ut på terminalen som ber brukeren om å oppgi verdien han vil skrive til den spesifiserte enhetsfilen. Deretter vil den gitte brukerinngangen bli lagret i "Num" -variabelen. Etter det vil det bli skrevet ut en melding på terminalen for å formidle at det passerte nummeret er skrevet til den spesifiserte enhetsfilen, etterfulgt av "IOCTL" -funksjonen som vil utføre denne handlingen. Deretter ønsker vi å lese verdien fra den samme filen som vi har skrevet ut en melding på terminalen og deretter igjen bruke "IOCTL" -funksjonen for å lese verdien fra den filen til "Val" -variabelen.

Etter det har vi skrevet ut verdien av "val" -variabelen på terminalen, som er verdien som er lest fra den spesifiserte enhetsfilen. Deretter publiserte vi en melding om terminalen for å formidle lukking av enhetsfilen. Denne meldingen blir fulgt av "Close" -funksjonen som brukes til å endre verdien av "Filedescriptor" -variabelen slik at enhetsfilen som diskuteres, kan lukkes trygt. Til slutt har vi brukt "retur 0" -erklæringen som den siste uttalelsen av C -programmet vårt.

Nå er det på tide å kompilere dette C -programmet for å se eventuelle feil. For det har vi brukt den pålagte kommandoen:

$ GCC IOCTL.c -o ioctl

For å kjøre denne kompilerte C -koden, har vi brukt kommandoen vist nedenfor:

$ ./ioctl

Når vi utførte dette C -skriptet, ble vi bedt om å oppgi verdien vi ønsket å sende til enhetsfilen. Vi har skrevet inn nummeret “3” som vist i følgende bilde:

Så snart vi ga denne verdien på terminalen, ble den umiddelbart skrevet på enhetsfilen vår. En ny verdi ble lest fra den filen og vist på terminalen, som vist på bildet nedenfor. Du kan også se på de påfølgende meldingene som er skrevet ut på terminalen som utdata fra dette C -programmet.

Vanlige feil allierte med IOCTL -funksjonen i C:

De tre vanligste feilene forbundet med "IOCTL" -funksjonen er som følger:

  • Ebadf: Filbeskrivelsen er ugyldig.
  • Efault: Nektet tilgang til ugyldig minne.
  • Einval: Forespørselen er ugyldig.

Konklusjon:

Denne artikkelen dreide seg om å diskutere “IOCTL” -funksjonen til C -programmeringsspråket. Vi uttalte det detaljerte formålet med denne funksjonen og filtypen som denne funksjonen generelt tar for seg. Deretter delte vi et grundig eksempel for å demonstrere bruken av denne funksjonen, etterfulgt av noen feil knyttet til denne funksjonen. Forhåpentligvis, etter å ha gått gjennom denne guiden, vil du forstå arbeidet med "IOCTL" -funksjonen til C -programmeringsspråket.