C Użycie funkcji IOCTL

C Użycie funkcji IOCTL
Proste pliki systemu opartego na systemie Linux można łatwo odczytać lub zapisać za pomocą prostych operacji wejściowych i wyjściowych. Istnieją jednak inne złożone typy plików, do których nie można uzyskać za pomocą prostych funkcji wejściowych i wyjściowych. Używamy funkcji „IOCTL” języka programowania C dla wszystkich takich plików. Oznacza „Kontrola wejściowa/ wyjściowa."

W tym artykule postaramy się zrozumieć cel funkcji „IOCTL” języka programowania C szczegółowo, patrząc na jego składnię. Następnie porozmawiamy trochę o typie pliku, dla którego używana jest ta funkcja, a także udostępnimy Ci lokalizację, w której takie pliki zwykle przebywają. Następnie zademonstrujemy przykład, który używa funkcji „IOCTL” języka programowania C. Na koniec omówimy niektóre błędy związane z tą konkretną funkcją.

Cel funkcji IOCTL w C:

Oprócz zwykłych plików systemu, istnieją niektóre pliki specjalnego przeznaczenia, takie jak pliki urządzeń. Pliki urządzeń są używane do interakcji z różnymi sterownikami urządzeń systemu. Jednak nie można uzyskać dostępu do tych plików urządzeń za pomocą zwykłych wywołań systemowych. W tym miejscu wchodzi funkcja „IOCTL”. Ta funkcja pomaga bardzo wygodnie uzyskać dostęp do tych plików. Funkcja „IOCTL” języka programowania C znajduje się w „IOCTL.H ”plik nagłówka.

Ogólna składnia tej funkcji znajduje się poniżej:

#Define „Nazwa IOCTL” _IO (NUM1, NUM2, typ argumentu)

Tutaj „Nazwa IOCTL” można zastąpić dowolną sensowną nazwą, którą chcesz dla swojej konkretnej funkcji. Następnie „_io” można pozostawić, tak jak dla funkcji „IOCTL” bez parametrów; Możesz jednak zastąpić go „_iow”, „_ior” i „_iowr” dla funkcji „IOCTL” z pisaniem, czytaniem, pisaniem i czytaniem obu możliwości. „Num1” odnosi się do unikalnego numeru przypisanego do naszego wywołania „IOCTL”, „NUM2” reprezentuje unikalny numer przypisany do funkcji „IOCTL”, podczas gdy „typ argumentu” odnosi się do danych, że ta konkretna funkcja „IOCTL” jest zdolna radzenia sobie z.

Gdzie pliki urządzeń znajdują się w systemie Linux?

Pliki urządzenia zwykle znajdują się w katalogu „/dev” systemu Linux. Dlatego, aby uzyskać dostęp do wszystkich takich plików za pomocą funkcji „IOCTL”, musisz przejść do katalogu „/dev” swojego systemu.

Wykorzystanie funkcji IOCTL w C:

Aby szczegółowo wyjaśnić użycie funkcji IOCTL w języku programowania C, skorzystaliśmy z prostego programu C pokazanego na poniższych obrazach. Zamierzamy otworzyć określony plik urządzenia z naszego systemu i napisać do niego losową wartość w tym programie. Po wykonaniu tego chcemy również odczytać wartość z tego samego pliku. Musisz spojrzeć na kod tego przykładu, aby lepiej go zrozumieć.

Po pierwsze, dołączyliśmy długą listę bibliotek lub plików nagłówka, których funkcje będą używane w tym programie C. Następnie zdefiniowaliśmy funkcje „odczyt” i „zapisz” za pomocą słowa kluczowego „Zdefiniuj” do odczytu i zapisywania plików urządzeń naszego systemu. Następnie, w ramach naszej funkcji „Main ()”, zdefiniowaliśmy zmienną liczbową o nazwie „FileDescriptor.„Ten deskryptor pliku zostanie użyty do sprawdzenia, czy plik naszego urządzenia został skutecznie otwarty, czy nie. Następnie zdefiniowaliśmy dwie inne zmienne typu int32_t o nazwie „Val” i „NUM.„Te zmienne przejdą od użytkownika w czasie wykonywania i wyświetli odpowiednie wyjście.

Następnie wydrukowaliśmy wiadomość, aby przekazać, że nasz program próbuje otworzyć plik urządzenia. Następnie, używając funkcji „Otwórz”, próbowaliśmy otworzyć żądany plik urządzenia, podając jego prawidłową ścieżkę, i.mi., katalog „/dev”, a następnie nazwa żądanego pliku urządzenia. Następnie chcieliśmy sprawdzić, czy plik został pomyślnie otwarty, czy nie. W tym celu musimy potwierdzić wartość zmiennej „Siledescriptor”. Załóżmy, że wartość ta będzie mniejsza niż „0”. W takim przypadku komunikat o błędzie zostanie wydrukowany na terminalu wskazującym, że określony plik urządzenia nie można otworzyć z powodu pewnego błędu, a program zakończy się natychmiast.

W przeciwnym razie, jeśli plik urządzenia zostanie pomyślnie otwarty, komunikat zostanie wydrukowany na terminalu z prośbą o wprowadzenie wartości, którą chce napisać do określonego pliku urządzenia. Następnie podane dane wejściowe użytkownika zostaną zapisane w zmiennej „num”. Następnie na terminalu zostanie wydrukowana wiadomość, aby przekazać, że przekazany numer został zapisany do określonego pliku urządzenia, a następnie funkcji „IOCTL”, która wykona tę akcję. Następnie chcemy odczytać wartość z tego samego pliku, dla którego wydrukowaliśmy wiadomość na terminalu, a następnie ponownie użyć funkcji „IOCTL”, aby odczytać wartość z tego pliku do zmiennej „Val”.

Następnie wydrukowaliśmy wartość zmiennej „VAL” na terminalu, która jest odczytana wartość z określonego pliku urządzenia. Następnie opublikowaliśmy wiadomość na terminalu w celu przekazania zamykania pliku urządzenia. Po tym komunikacie następuje funkcja „Zamknij” używaną do modyfikacji wartości zmiennej „FILEDESCRIPTOR”, aby omawiany plik urządzenia można było bezpiecznie zamknąć. Wreszcie, użyliśmy instrukcji „Return 0” jako ostatniego stwierdzenia naszego programu C.

Teraz nadszedł czas, aby skompilować ten program C, aby zobaczyć wszelkie błędy. W tym celu użyliśmy polecenia przymocowanego:

$ gcc ioCtl.c -o ioctl

Do uruchomienia tego skompilowanego kodu C użyliśmy polecenia pokazanego poniżej:

$ ./IOCTL

Po wykonaniu tego skryptu C zostaliśmy poproszeni o wprowadzenie wartości, którą chcieliśmy wysłać do pliku urządzenia. Wprowadziliśmy numer „3”, jak pokazano na poniższym obrazku:

Jak tylko dostarczyliśmy tę wartość na terminalu, natychmiast został zapisany na pliku naszego urządzenia. Nowa wartość została odczytana z tego pliku i wyświetlona na terminalu, jak pokazano na poniższym obrazku. Możesz także spojrzeć na kolejne komunikaty wydrukowane na terminalu jako wyjście tego programu C.

Typowe błędy powiązane z funkcją IOCTL w C:

Trzy najczęstsze błędy związane z funkcją „IOCTL” są następujące:

  • Ebadf: Deskryptor pliku jest nieprawidłowy.
  • Efault: Odmówiono dostępu do nieprawidłowej pamięci.
  • Einval: Żądanie jest nieprawidłowe.

Wniosek:

W tym artykule dotyczyło omawiania funkcji „IOCTL” języka programowania C. Podaliśmy szczegółowy cel tej funkcji i typu, z którym ta funkcja ogólnie zajmuje. Następnie podzieliliśmy dokładny przykład, aby zademonstrować użycie tej funkcji, a następnie niektóre błędy związane z tą funkcją. Mam nadzieję, że po przejściu przez ten przewodnik dobrze zrozumiesz działanie funkcji „IOCTL” w języku programowania C.