C Uso da função ioctl

C Uso da função ioctl
Os arquivos simples de um sistema baseado em Linux podem ser facilmente lidos ou escritos usando operações simples de entrada e saída. No entanto, também existem outros tipos complexos de arquivos que não podem ser acessados ​​com a ajuda de funções simples de entrada e saída. Usamos a função “ioctl” da linguagem de programação C para todos esses arquivos. Significa “Controle de entrada/ saída.”

Neste artigo, tentaremos entender o objetivo da função “ioctl” da linguagem de programação C, analisando sua sintaxe. Em seguida, falaremos um pouco sobre o tipo de arquivo para o qual essa função é usada, e também compartilharemos com você o local onde esses arquivos geralmente residem. Em seguida, demonstraremos um exemplo que usa a função "ioctl" da linguagem de programação C. Finalmente, discutiremos alguns erros associados a esta função específica.

O objetivo da função do IOCTL em C:

Além dos arquivos regulares de um sistema, existem alguns arquivos de propósito especial, como os arquivos do dispositivo. Os arquivos do dispositivo são os usados ​​para interagir com os diferentes drivers de dispositivo de um sistema. No entanto, você não pode acessar esses arquivos de dispositivo com a ajuda de chamadas regulares do sistema. É aqui que a função "ioctl" entra em jogo. Esta função ajuda a acessar esses arquivos de maneira muito conveniente. A função “ioctl” da linguagem de programação C reside dentro do “ioctl.arquivo de cabeçalho H ”.

A sintaxe geral desta função é anexada abaixo:

#Define “Nome of ioctl” _io (num1, num2, tipo de argumento)

Aqui, “Nome do IOCTL” pode ser substituído por qualquer nome significativo que você deseja para sua função particular. Então, "_io" pode ser deixado como é para uma função "ioctl" sem parâmetros; No entanto, você também pode substituí -lo por "_iow", "_ior" e "_iowr" para uma função "ioctl" tendo escrita, leitura, escrita e leitura de ambos os recursos. "Num1" refere -se ao número exclusivo atribuído à nossa chamada "ioctl", "num2" representa o número exclusivo atribuído à função "ioctl", enquanto o "tipo de argumento" se refere aos dados que essa função "ioctl" é capaz de lidar com.

Onde os arquivos do dispositivo residem em um sistema Linux?

Os arquivos do dispositivo geralmente residem no diretório "/dev" de um sistema baseado em Linux. Portanto, para acessar todos esses arquivos com a ajuda da função "ioctl", você deve navegar para o diretório "/dev" do seu sistema.

Uso da função IOCTL em C:

Para explicar em detalhes o uso da função IOCTL na linguagem de programação C, fizemos uso de um programa C simples mostrado nas imagens abaixo. Pretendemos abrir um arquivo de dispositivo específico do nosso sistema e escrever um valor aleatório para ele neste programa. Depois de fazer isso, também queremos ler um valor do mesmo arquivo. Você precisa olhar para o código para este exemplo para entendê -lo mais claramente.

Primeiro, incluímos uma longa lista de bibliotecas ou arquivos de cabeçalho cujas funções serão usadas neste programa C. Em seguida, definimos as funções “Read” e “Write” usando a palavra -chave “Definir” para ler e escrever os arquivos de dispositivo do nosso sistema. Depois disso, dentro da nossa função "Main ()", definimos uma variável inteira chamada "FilDescriptor.”Este descritor de arquivo será usado para verificar se nosso arquivo de dispositivo foi aberto de maneira eficaz ou não. Em seguida, definimos duas outras variáveis ​​do tipo int32_T chamado "val" e "num.”Essas variáveis ​​receberão a entrada do usuário no tempo de execução e exibirão a saída correspondente.

Depois disso, imprimimos uma mensagem para transmitir que nosso programa está tentando abrir o arquivo do dispositivo. Em seguida, usando a função "aberta", tentamos abrir o arquivo de dispositivo desejado, fornecendo seu caminho correto, i.e., O diretório "/dev" seguido pelo nome do arquivo de dispositivo desejado. Depois disso, queríamos verificar se o arquivo foi aberto com sucesso ou não. Para fazer isso, precisamos validar o valor da variável "FilDescriptor". Suponha que esse valor seja menor que "0". Nesse caso, uma mensagem de erro será impressa no terminal, indicando que o arquivo de dispositivo especificado não poderia ser aberto devido a algum erro, e o programa será encerrado imediatamente.

Caso contrário, se o arquivo do dispositivo for aberto com sucesso, uma mensagem será impressa no terminal solicitando ao usuário que insira o valor que ele deseja escrever no arquivo de dispositivo especificado. Em seguida, a entrada do usuário fornecida será salva na variável "num". Depois disso, uma mensagem será impressa no terminal para transmitir que o número aprovado foi escrito no arquivo de dispositivo especificado, seguido pela função "ioctl" que executará esta ação. Em seguida, queremos ler o valor do mesmo arquivo para o qual imprimimos uma mensagem no terminal e, em seguida, use novamente a função "ioctl" para ler o valor desse arquivo na variável "val".

Depois disso, imprimimos o valor da variável "Val" no terminal, que é o valor lido do arquivo de dispositivo especificado. Em seguida, publicamos uma mensagem no terminal para transmitir o fechamento do arquivo do dispositivo. Esta mensagem é seguida pela função "Fechar" usada para modificar o valor da variável "FileDescriptor", para que o arquivo de dispositivo em discussão possa ser fechado com segurança. Finalmente, usamos a declaração "Return 0" como a última declaração do nosso programa C.

Agora, é hora de compilar este programa C para ver algum erro. Para isso, usamos o comando afixado:

$ gcc ioctl.C -o ioctl

Para executar este código C compilado, usamos o comando mostrado abaixo:

$ ./ioctl

Depois que executamos este script C, fomos convidados a inserir o valor que queríamos enviar para o arquivo do dispositivo. Entramos no número "3", como mostrado na imagem a seguir:

Assim que fornecemos esse valor no terminal, ele foi imediatamente escrito em nosso arquivo de dispositivo. Um novo valor foi lido desse arquivo e exibido no terminal, como mostrado na imagem abaixo. Você também pode olhar para as mensagens sucessivas impressas no terminal como a saída deste programa C.

Erros comuns aliados à função IOCTL em C:

Os três erros mais comuns associados à função "ioctl" são os seguintes:

  • Ebadf: O descritor de arquivo é inválido.
  • Efault: Acesso negado à memória inválida.
  • Einval: A solicitação é inválida.

Conclusão:

Este artigo girou em torno de discutir a função "ioctl" da linguagem de programação C. Declaramos o objetivo detalhado desta função e o tipo de arquivo com o qual essa função geralmente lida. Em seguida, compartilhamos um exemplo completo para demonstrar o uso dessa função, seguido por alguns erros associados a esta função. Felizmente, depois de passar por este guia, você entenderá o funcionamento da função "ioctl" da linguagem de programação C bem.