6.7. Функция ioctl()

We use cookies. Read the Privacy and Cookie Policy

6.7. Функция ioctl()

Системный вызов ioctl() — это универсальное средство управления аппаратными устройствами. Первым аргументом функции является дескриптор файла того устройства, которым требуется управлять. Второй аргумент — это код запроса, обозначающего выполняемую операцию. Разным устройствам соответствуют разные запросы. В зависимости от запроса функции ioctl() могут потребоваться дополнительные аргументы.

Многие коды запросов перечислены на man-странице ioctl_list. При работе с функцией ioctl() нужно хорошо понимать, как работает драйвер соответствующего устройства. В принципе, эти вопросы выходят за рамки нашей книги, но все же приведем небольшой пример.

Листинг 6.2. (cdrom-eject.c) Извлечение компакт-диска из дисковода

#include <fcntl.h>

#include <linux/cdrom.h>

#include <sys/ioctl.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <unistd.h>

int main(int argc, char* argv[]) {

 /* Открытие файла устройства, указанного в командной строке. */

 int fd = open(argv[1], O_RDONLY);

 /* Извлечение компакт-диска из дисковода. */

 ioctl(fd, CDROMEJECT);

 /* Закрытие файла. */

 close(fd);

 return 0;

}

В листинге 6.2 представлена короткая программа, которая запрашивает извлечение компакт-диска из дисковода CD-ROM. Программа принимает единственный аргумент командной строки: имя дисковода CD-ROM. Программа открывает файл устройства и вызывает функцию ioctl() с кодом запроса CDROMEJECT. Этот код определен в файле <linux/cdrom.h> и служит устройству указанием извлечь компакт-диск из дисковода.

Например, если в системе имеется IDE-дисковод CD-ROM, подключенный в качестве главного устройства к дополнительному IDE-контроллеру, соответствующий файл устройства будет называться /dev/hdc. Тогда компакт-диск извлекается из дисковода с помощью такой команды:

% ./cdrom-eject /dev/hdc