Utilizzo della funzione c ioctl

Utilizzo della funzione c ioctl
I file semplici di un sistema basato su Linux possono essere facilmente letti o scritti utilizzando semplici operazioni di input e output. Tuttavia, ci sono anche altri tipi complessi di file a cui non è possibile accedere con l'aiuto di semplici funzioni di input e output. Usiamo la funzione "IOCTL" del linguaggio di programmazione C per tutti questi file. Sta per "controllo input/ output."

In questo articolo, cercheremo di comprendere lo scopo della funzione "IOCTL" del linguaggio di programmazione C in modo approfondito osservando la sua sintassi. Quindi, parleremo un po 'del tipo di file per il quale viene utilizzata questa funzione e condivideremo anche con te la posizione in cui tali file di solito risiedono. Quindi, dimostreremo un esempio che utilizza la funzione "IOCTL" del linguaggio di programmazione C. Infine, discuteremo alcuni errori associati a questa particolare funzione.

Lo scopo della funzione IOCTL in C:

Oltre ai file regolari di un sistema, ci sono alcuni file di scopo speciale, come i file del dispositivo. I file del dispositivo sono quelli che vengono utilizzati per interagire con i diversi driver di dispositivo di un sistema. Tuttavia, non è possibile accedere a questi file di dispositivi con l'aiuto di chiamate di sistema regolari. È qui che entra in gioco la funzione "IOCTL". Questa funzione aiuta ad accedere a questi file in modo molto conveniente. La funzione "IOCTL" del linguaggio di programmazione C risiede all'interno del "IOCTL.File di intestazione h ".

La sintassi generale di questa funzione è aggiunta di seguito:

#define “Nome of IoCtl” _io (num1, num2, tipo di argomento)

Qui, "Nome di IoCTL" può essere sostituito da qualsiasi nome significativo che desideri per la tua particolare funzione. Quindi, "_io" può essere lasciato per una funzione "IOCTL" senza parametri; Tuttavia, puoi anche sostituirlo con "_iow", "_ior" e "_iowr" per una funzione "IOCTL" con scrittura, lettura e scrittura e lettura di entrambe le funzionalità. "Num1" si riferisce al numero univoco assegnato alla nostra chiamata "IOCTL", "Num2" rappresenta il numero univoco assegnato alla funzione "IOCTL", mentre il "tipo di argomento" si riferisce ai dati che questa particolare funzione "IOCTL" è in grado di affrontare.

Dove risiedono i file del dispositivo su un sistema Linux?

I file del dispositivo di solito risiedono nella directory "/dev" di un sistema basato su Linux. Pertanto, per accedere a tutti questi file con l'aiuto della funzione "IOCTL", è necessario passare alla directory "/dev" del sistema.

Utilizzo della funzione IOCTL in C:

Per spiegarti in dettaglio l'uso della funzione IOCTL nel linguaggio di programmazione C, abbiamo utilizzato un semplice programma C mostrato nelle immagini seguenti. Intendiamo aprire un file di dispositivo specifico dal nostro sistema e scriverne un valore casuale in questo programma. Dopo averlo fatto, vogliamo anche leggere un valore dallo stesso file. Devi guardare il codice per questo esempio per capirlo più chiaramente.

Innanzitutto, abbiamo incluso un lungo elenco di librerie o file di intestazione le cui funzioni verranno utilizzate in questo programma C. Quindi, abbiamo definito le funzioni "Leggi" e "Scrivi" utilizzando la parola chiave "Defini" per la lettura e la scrittura dei file del dispositivo del nostro sistema. Successivamente, all'interno della nostra funzione "main ()", abbiamo definito una variabile intera denominata "FileDescriptor."Questo descrittore di file verrà utilizzato per verificare se il nostro file del dispositivo è stato aperto in modo efficace o no. Quindi, abbiamo definito altre due variabili di tipo int32_t denominato "val" e "num."Queste variabili prendono input dall'utente in fase di runtime e visualizzano l'uscita corrispondente.

Successivamente, abbiamo stampato un messaggio per comunicare che il nostro programma sta tentando di aprire il file del dispositivo. Quindi, usando la funzione "aperta", abbiamo tentato di aprire il file del dispositivo desiderato fornendo il suo percorso corretto, i.e., La directory "/dev" seguita dal nome del file del dispositivo desiderato. Dopodiché, volevamo verificare se il file era stato aperto correttamente o no. Per fare ciò, dobbiamo convalidare il valore della variabile "filedeScriptor". Supponiamo che questo valore sarà inferiore a "0". In tal caso, un messaggio di errore verrà stampato sul terminale indicando che il file del dispositivo specificato non può essere aperto a causa di qualche errore e il programma terminerà immediatamente.

Altrimenti, se il file del dispositivo viene aperto correttamente, un messaggio verrà stampato sul terminale chiedendo all'utente di inserire il valore che desidera scrivere nel file del dispositivo specificato. Quindi, l'input dell'utente dato verrà salvato nella variabile "num". Successivamente, un messaggio verrà stampato sul terminale per comunicare che il numero passato è stato scritto nel file del dispositivo specificato, seguito dalla funzione "IOCTL" che eseguirà questa azione. Quindi, vogliamo leggere il valore dallo stesso file per il quale abbiamo stampato un messaggio sul terminale e quindi utilizzare nuovamente la funzione "IOCTL" per leggere il valore da quel file nella variabile "Val".

Successivamente, abbiamo stampato il valore della variabile "Val" sul terminale, che è il valore letto dal file del dispositivo specificato. Quindi, abbiamo pubblicato un messaggio sul terminale per trasmettere la chiusura del file del dispositivo. Questo messaggio è seguito dalla funzione "Chiudi" utilizzata per modificare il valore della variabile "Filencescriptor" in modo che il file del dispositivo in discussione possa essere chiuso in modo sicuro. Infine, abbiamo usato la dichiarazione "return 0" come ultima dichiarazione del nostro programma C.

Ora è tempo di compilare questo programma C per vedere eventuali errori. Per questo, abbiamo usato il comando apposto:

$ GCC IOCTL.c -o ioctl

Per l'esecuzione di questo codice C compilato, abbiamo usato il comando mostrato di seguito:

$ ./ioctl

Una volta eseguito questo script C, ci è stato chiesto di inserire il valore che volevamo inviare al file del dispositivo. Abbiamo inserito il numero "3" come mostrato nella seguente immagine:

Non appena abbiamo fornito questo valore al terminale, è stato immediatamente scritto sul nostro file del dispositivo. Un nuovo valore è stato letto da quel file e visualizzato sul terminale, come mostrato nell'immagine seguente. Puoi anche guardare i messaggi successivi stampati sul terminale come l'output di questo programma C.

Errori comuni alleati con la funzione IOCTL in C:

I tre errori più comuni associati alla funzione "IOCTL" sono i seguenti:

  • Ebadf: Il descrittore di file non è valido.
  • Efault: Negato l'accesso alla memoria non valida.
  • Einval: La richiesta non è valida.

Conclusione:

Questo articolo ruotava attorno a discutere la funzione "IOCTL" del linguaggio di programmazione C. Abbiamo dichiarato lo scopo dettagliato di questa funzione e il tipo di file che questa funzione generalmente tratta. Quindi, abbiamo condiviso un esempio approfondito per dimostrare l'uso di questa funzione, seguito da alcuni errori associati a questa funzione. Spero che, dopo aver esaminato questa guida, capirai il funzionamento della funzione "IOCTL" del linguaggio di programmazione C.